[med-svn] [bioperl] 01/01: New upstream version 1.7

Andreas Tille tille at debian.org
Mon Dec 5 21:21:21 UTC 2016


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to annotated tag upstream/1.7
in repository bioperl.

commit 532cf8a59cf1793ac69642399d2f0ec5aa1bc80c
Author: Andreas Tille <tille at debian.org>
Date:   Fri Oct 21 11:22:34 2016 +0200

    New upstream version 1.7
---
 .travis.yml                             |  13 +-
 Bio/Align/AlignI.pm                     | 102 +++----
 Bio/AlignIO/fasta.pm                    |   2 +-
 Bio/AlignIO/maf.pm                      |   4 +-
 Bio/AnalysisI.pm                        |  14 +-
 Bio/DB/Expression/geo.pm                |   8 +-
 Bio/DB/GFF/Typename.pm                  |   2 +-
 Bio/DB/GenBank.pm                       |   2 +-
 Bio/DB/MeSH.pm                          |  98 ++++---
 Bio/DB/SeqVersion/gi.pm                 |   6 +-
 Bio/DB/Taxonomy/entrez.pm               |  59 ++--
 Bio/Index/Stockholm.pm                  |  60 ++--
 Bio/Restriction/IO/prototype.pm         |   2 +-
 Bio/Root/IO.pm                          |  29 +-
 Bio/Root/Version.pm                     |   2 +-
 Bio/Search/Hit/GenericHit.pm            |   5 +-
 Bio/Search/Hit/ModelHit.pm              |   3 +
 Bio/Search/Result/GenericResult.pm      |   4 +-
 Bio/Search/Result/ResultI.pm            |   4 +-
 Bio/SearchIO/Writer/HTMLResultWriter.pm |   4 +-
 Bio/SeqFeature/Tools/Unflattener.pm     |   2 +-
 Bio/SeqIO.pm                            |  18 +-
 Bio/SeqIO/bsml.pm                       |  49 ++--
 Bio/SeqIO/embl.pm                       |  29 +-
 Bio/SeqIO/tinyseq.pm                    |   4 +-
 Bio/SeqIO/tinyseq/tinyseqHandler.pm     |   6 +-
 Bio/Tools/CodonTable.pm                 |  28 +-
 Bio/Tools/ERPIN.pm                      | 350 -----------------------
 Bio/Tools/Infernal.pm                   | 492 --------------------------------
 Bio/Tools/RNAMotif.pm                   | 427 ---------------------------
 Bio/Tools/Run/RemoteBlast.pm            |   4 +-
 Build.PL                                |  10 +-
 Changes                                 |  52 +++-
 INSTALL-WIN.md                          |  87 +++---
 INSTALL.md                              | 160 ++++++++---
 MANIFEST                                |   6 +-
 META.json                               |  17 +-
 META.yml                                |  12 +-
 maintenance/authors.pl                  |   2 +-
 scripts/DB-HIV/bp_hivq.pl               |  24 +-
 scripts/DB/bp_biofetch_genbank_proxy.pl |   4 +-
 scripts/DB/bp_biogetseq.pl              |   2 +-
 scripts/seq/bp_extract_feature_seq.pl   |   6 +-
 scripts/seq/bp_seqcut.pl                |  17 +-
 scripts/taxa/bp_taxid4species.pl        |   2 +-
 scripts/utilities/bp_netinstall.pl      |  24 +-
 scripts/utilities/bp_search2gff.pl      |   4 +-
 t/AlignIO/fasta.t                       |   8 +-
 t/LocalDB/Fasta.t                       |  20 +-
 t/LocalDB/Taxonomy/sqlite.t             |   3 +-
 t/RemoteDB/MeSH.t                       |  21 +-
 t/RemoteDB/Taxonomy.t                   |  30 +-
 t/SeqIO/fastq.t                         |  16 +-
 t/SeqTools/CodonTable.t                 |  27 +-
 t/Tools/Analysis/Protein/ELM.t          |  40 +--
 t/Tools/rnamotif.t                      | 230 ---------------
 t/data/EG352462.gbxml                   |   2 +-
 t/data/dbfa/mixed_alphabet.fasta        |  12 +
 t/data/fastq/RT98876.fastq              |   4 +
 t/data/so.obo                           |  20 +-
 t/data/test.locuslink                   |  12 +-
 t/data/test.tseq                        |   2 +-
 travis_scripts/trigger-dockerhub.sh     |  49 ++++
 63 files changed, 797 insertions(+), 1960 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4befb9b..0979812 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,11 +1,10 @@
 language: perl
 perl:
+  - "5.24"
   - "5.20"
   - "5.18"
   - "5.16"
   - "5.14"
-  - "5.12"
-  - "5.10"
 
 sudo: false
 env: PERL_CPANM_OPT="--notest --force --skip-satisfied"
@@ -28,8 +27,7 @@ install:
     - "cpanm XML::DOM::XPath XML::Parser XML::Parser::PerlSAX 2>&1 | tail -n 1"
     - "cpanm XML::SAX XML::SAX::Writer XML::Simple XML::LibXML XML::Twig XML::Writer 2>&1 | tail -n 1"
     - "cpanm PostScript::TextBlock Set::Scalar Sort::Naturally YAML | tail -n 1"
-    - "cpanm Math::Random SOAP::Lite Spreadsheet::ParseExcel | tail -n 1"
-    - "cpanm Bio::ASN1::EntrezGene | tail -n 1"
+    - "cpanm Math::Random Spreadsheet::ParseExcel | tail -n 1"
     - "cpanm Bio::Phylo | tail -n 1"
     - "cpanm Test::Weaken | tail -n 1"
     - "cpanm Test::Memory::Cycle | tail -n 1"
@@ -48,9 +46,12 @@ script:
     #- PERL5OPT=-MDevel::Cover=+ignore,prove,-coverage,statement,subroutine prove -lr t #limited version coverage test
     #- cover -report coveralls
 
+after_success:
+    - ./travis_scripts/trigger-dockerhub.sh
+
 #TODO - send emails to bioperl-guts-l
 notifications:
-  email: 
+  email:
     recipients:
       - bioperl-guts-l at lists.open-bio.org
       - cjfields1 at gmail.com
@@ -61,4 +62,4 @@ notifications:
 branches:
   only:
     - master
-
+    - /^release-[1-9]*-[0-9]*-[0-9]*$/
diff --git a/Bio/Align/AlignI.pm b/Bio/Align/AlignI.pm
index f5559f8..3c79e4f 100644
--- a/Bio/Align/AlignI.pm
+++ b/Bio/Align/AlignI.pm
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::Align::AlignI
 #
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
+# Please direct questions and support issues to <bioperl-l at bioperl.org>
 #
 # Cared for by Jason Stajich <jason at bioperl.org>
 #
@@ -53,15 +53,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l at bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l at bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -164,13 +164,13 @@ sub purge {
 
  Title     : sort_alphabetically
  Usage     : $ali->sort_alphabetically
- Function  : 
+ Function  :
 
-             Changes the order of the alignment to alphabetical on name 
+             Changes the order of the alignment to alphabetical on name
              followed by numerical by number.
 
  Returns   : an array
- Argument  : 
+ Argument  :
 
 =cut
 
@@ -186,10 +186,10 @@ Methods returning one or more sequences objects.
 =head2 each_seq
 
  Title     : each_seq
- Usage     : foreach $seq ( $align->each_seq() ) 
+ Usage     : foreach $seq ( $align->each_seq() )
  Function  : Gets an array of Seq objects from the alignment
  Returns   : an array
- Argument  : 
+ Argument  :
 
 =cut
 
@@ -204,12 +204,12 @@ sub each_seq {
  Usage     : foreach $seq ( $ali->each_alphabetically() )
  Function  :
 
-             Returns an array of sequence object sorted alphabetically 
+             Returns an array of sequence object sorted alphabetically
              by name and then by start point.
              Does not change the order of the alignment
 
- Returns   : 
- Argument  : 
+ Returns   :
+ Argument  :
 
 =cut
 
@@ -221,8 +221,8 @@ sub each_alphabetically {
 =head2 each_seq_with_id
 
  Title     : each_seq_with_id
- Usage     : foreach $seq ( $align->each_seq_with_id() ) 
- Function  : 
+ Usage     : foreach $seq ( $align->each_seq_with_id() )
+ Function  :
 
              Gets an array of Seq objects from the
              alignment, the contents being those sequences
@@ -242,7 +242,7 @@ sub each_seq_with_id {
 
  Title     : get_seq_by_pos
  Usage     : $seq = $aln->get_seq_by_pos(3) # third sequence from the alignment
- Function  : 
+ Function  :
 
              Gets a sequence based on its position in the alignment.
              Numbering starts from 1.  Sequence positions larger than
@@ -267,7 +267,7 @@ current MSE.
 
  Title     : select
  Usage     : $aln2 = $aln->select(1, 3) # three first sequences
- Function  : 
+ Function  :
 
              Creates a new alignment from a continuous subset of
              sequences.  Numbering starts from 1.  Sequence positions
@@ -289,7 +289,7 @@ sub select {
 
  Title     : select_noncont
  Usage     : $aln2 = $aln->select_noncont(1, 3) # first and 3rd sequences
- Function  : 
+ Function  :
 
              Creates a new alignment from a subset of
              sequences.  Numbering starts from 1.  Sequence positions
@@ -309,7 +309,7 @@ sub select_noncont {
 
  Title     : slice
  Usage     : $aln2 = $aln->slice(20, 30)
- Function  : 
+ Function  :
 
              Creates a slice from the alignment inclusive of start and
              end columns.  Sequences with no residues in the slice are
@@ -318,8 +318,8 @@ sub select_noncont {
              padding.
 
  Returns   : a Bio::SimpleAlign object
- Argument  : positive integer for start column 
-             positive integer for end column 
+ Argument  : positive integer for start column
+             positive integer for end column
 
 =cut
 
@@ -338,14 +338,14 @@ alignment.
 
  Title     : map_chars
  Usage     : $ali->map_chars('\.','-')
- Function  : 
+ Function  :
 
              Does a s/$arg1/$arg2/ on the sequences. Useful for gap
              characters
 
-             Notice that the from (arg1) is interpreted as a regex,
-             so be careful about quoting meta characters (eg
-             $ali->map_chars('.','-') wont do what you want)
+             Notice that the "from" (arg1) is interpreted as a regex,
+             so be careful about quoting meta characters (e.g.
+             $ali->map_chars('.', '-') won't do what you want)
 
  Returns   : None
  Argument  : 'from' rexexp
@@ -363,8 +363,8 @@ sub map_chars {
  Title     : uppercase()
  Usage     : $ali->uppercase()
  Function  : Sets all the sequences to uppercase
- Returns   : 
- Argument  : 
+ Returns   :
+ Argument  :
 
 =cut
 
@@ -394,7 +394,7 @@ sub match_line {
 
  Title     : match()
  Usage     : $ali->match()
- Function  : 
+ Function  :
 
              Goes through all columns and changes residues that are
              identical to residue in first sequence to match '.'
@@ -419,7 +419,7 @@ sub match {
 
  Title     : unmatch()
  Usage     : $ali->unmatch()
- Function  : 
+ Function  :
 
              Undoes the effect of method match. Unsets match_char.
 
@@ -436,7 +436,7 @@ sub unmatch {
 
 =head1 MSE attibutes
 
-Methods for setting and reading the MSE attributes. 
+Methods for setting and reading the MSE attributes.
 
 Note that the methods defining character semantics depend on the user
 to set them sensibly.  They are needed only by certain input/output
@@ -462,8 +462,8 @@ sub id {
  Title     : missing_char
  Usage     : $myalign->missing_char("?")
  Function  : Gets/sets the missing_char attribute of the alignment
-             It is generally recommended to set it to 'n' or 'N' 
-             for nucleotides and to 'X' for protein. 
+             It is generally recommended to set it to 'n' or 'N'
+             for nucleotides and to 'X' for protein.
  Returns   : An missing_char string,
  Argument  : An missing_char string (optional)
 
@@ -521,14 +521,14 @@ sub symbol_chars{
 
 =head1 Alignment descriptors
 
-These read only methods describe the MSE in various ways. 
+These read only methods describe the MSE in various ways.
 
 
 =head2 consensus_string
 
  Title     : consensus_string
  Usage     : $str = $ali->consensus_string($threshold_percent)
- Function  : Makes a strict consensus 
+ Function  : Makes a strict consensus
  Returns   : consensus string
  Argument  : Optional threshold ranging from 0 to 100.
              The consensus residue has to appear at least threshold %
@@ -547,7 +547,7 @@ sub consensus_string {
 
  Title     : consensus_iupac
  Usage     : $str = $ali->consensus_iupac()
- Function  : 
+ Function  :
 
              Makes a consensus using IUPAC ambiguity codes from DNA
              and RNA. The output is in upper case except when gaps in
@@ -574,14 +574,14 @@ sub consensus_iupac {
 
  Title     : is_flush
  Usage     : if( $ali->is_flush() )
-           : 
            :
- Function  : Tells you whether the alignment 
+           :
+ Function  : Tells you whether the alignment
            : is flush, ie all of the same length
-           : 
+           :
            :
  Returns   : 1 or 0
- Argument  : 
+ Argument  :
 
 =cut
 
@@ -593,11 +593,11 @@ sub is_flush {
 =head2 length
 
  Title     : length()
- Usage     : $len = $ali->length() 
+ Usage     : $len = $ali->length()
  Function  : Returns the maximum length of the alignment.
              To be sure the alignment is a block, use is_flush
  Returns   : integer
- Argument  : 
+ Argument  :
 
 =cut
 
@@ -610,13 +610,13 @@ sub length {
 
  Title     : maxname_length
  Usage     : $ali->maxname_length()
- Function  : 
+ Function  :
 
              Gets the maximum length of the displayname in the
              alignment. Used in writing out various MSE formats.
 
  Returns   : integer
- Argument  : 
+ Argument  :
 
 =cut
 
@@ -662,7 +662,7 @@ sub num_sequences {
  Title   : percentage_identity
  Usage   : $id = $align->percentage_identity
  Function: The function calculates the percentage identity of the alignment
- Returns : The percentage identity of the alignment (as defined by the 
+ Returns : The percentage identity of the alignment (as defined by the
 	   implementation)
  Argument: None
 
@@ -677,7 +677,7 @@ sub percentage_identity{
 
  Title   : overall_percentage_identity
  Usage   : $id = $align->overall_percentage_identity
- Function: The function calculates the percentage identity of 
+ Function: The function calculates the percentage identity of
            the conserved columns
  Returns : The percentage identity of the conserved columns
  Args    : None
@@ -694,7 +694,7 @@ sub overall_percentage_identity{
 
  Title   : average_percentage_identity
  Usage   : $id = $align->average_percentage_identity
- Function: The function uses a fast method to calculate the average 
+ Function: The function uses a fast method to calculate the average
            percentage identity of the alignment
  Returns : The average percentage identity of the alignment
  Args    : None
@@ -786,12 +786,12 @@ sub displayname {
 
  Title     : set_displayname_count
  Usage     : $ali->set_displayname_count
- Function  : 
+ Function  :
 
              Sets the names to be name_# where # is the number of
              times this name has been used.
 
- Returns   : None 
+ Returns   : None
  Argument  : None
 
 =cut
@@ -820,7 +820,7 @@ sub set_displayname_flat {
 =head2 set_displayname_normal
 
  Title     : set_displayname_normal
- Usage     : $ali->set_displayname_normal() 
+ Usage     : $ali->set_displayname_normal()
  Function  : Makes all the sequences be displayed as name/start-end
  Returns   : None
  Argument  : None
@@ -840,7 +840,7 @@ sub set_displayname_normal {
  Usage     : $no = $ali->no_residues
  Function  : number of residues in total in the alignment
  Returns   : integer
- Argument  : 
+ Argument  :
  Note      : deprecated in favor of num_residues()
 
 =cut
@@ -857,7 +857,7 @@ sub no_residues {
  Function  : number of sequence in the sequence alignment
  Returns   : integer
  Argument  : None
- Note      : deprecated in favor of num_sequences() 
+ Note      : deprecated in favor of num_sequences()
 
 =cut
 
diff --git a/Bio/AlignIO/fasta.pm b/Bio/AlignIO/fasta.pm
index 5915c85..d32523c 100644
--- a/Bio/AlignIO/fasta.pm
+++ b/Bio/AlignIO/fasta.pm
@@ -128,7 +128,7 @@ sub next_aln {
     $seqchar =~ s/\s//g;
 
     #  Put away last name and sequence
-    if ( $name =~ /(\S+)\/(\d+)-(\d+)$/ ) {
+    if ( $name =~ /(\S+\/(\d+)-(\d+))$/ ) {
         $seqname = $1;
         $start   = $2;
         $end     = $3;
diff --git a/Bio/AlignIO/maf.pm b/Bio/AlignIO/maf.pm
index 99aef7b..5f42a2d 100644
--- a/Bio/AlignIO/maf.pm
+++ b/Bio/AlignIO/maf.pm
@@ -172,8 +172,8 @@ sub next_aln {
     $strand = $strand eq '+' ? 1 : $strand eq '-' ? -1 : 0;
 	my $seq = Bio::LocatableSeq->new('-seq'          => $text,
 					 '-display_id'   => $src,
-					 '-start'        => $start,
-					 '-end'          => $start + $size - 1,
+					 '-start'        => $strand > 0 ? $start                : ($srcsize-($start+$size-2)),
+					 '-end'          => $strand > 0 ? ($start + $size - 1)  : ($srcsize-($start-1)) ,
 					 '-strand'       => $strand,
 					 '-alphabet'     => $self->alphabet,
 					);
diff --git a/Bio/AnalysisI.pm b/Bio/AnalysisI.pm
index 11fcbaf..c0fb99d 100644
--- a/Bio/AnalysisI.pm
+++ b/Bio/AnalysisI.pm
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::AnalysisI
 #
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
+# Please direct questions and support issues to <bioperl-l at bioperl.org>
 #
 # Cared for by Martin Senger <martin.senger at gmail.com>
 # For copyright and disclaimer see below.
@@ -38,15 +38,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l at bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l at bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -665,10 +665,10 @@ sub elapsed { shift->throw_not_implemented(); }
 =head2 times
 
  Usage   : $job->times ('formatted')
- Returns : a hash refrence with all time characteristics
+ Returns : a hash reference with all time characteristics
  Args    : optional
 
-It is a convenient method returning a hash reference with the folowing
+It is a convenient method returning a hash reference with the following
 keys:
 
    created
diff --git a/Bio/DB/Expression/geo.pm b/Bio/DB/Expression/geo.pm
index 20ab87f..63b280e 100644
--- a/Bio/DB/Expression/geo.pm
+++ b/Bio/DB/Expression/geo.pm
@@ -64,10 +64,10 @@ use Bio::Expression::DataSet;
 use Bio::Expression::Platform;
 use Bio::Expression::Sample;
 
-use constant URL_PLATFORMS => 'http://www.ncbi.nlm.nih.gov/geo/query/browse.cgi?pgsize=100000&mode=platforms&submitter=-1&filteron=0&filtervalue=-1&private=1&sorton=pub_date&sortdir=1&start=1';
-use constant URL_PLATFORM => 'http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
-use constant URL_DATASET => 'http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
-use constant URL_SAMPLE => 'http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
+use constant URL_PLATFORMS => 'https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms';
+use constant URL_PLATFORM => 'https://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
+use constant URL_DATASET => 'https://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
+use constant URL_SAMPLE => 'https://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?form=text&view=full&acc=';
 
 =head2 _initialize()
 
diff --git a/Bio/DB/GFF/Typename.pm b/Bio/DB/GFF/Typename.pm
index 1b9ed14..9b15cf4 100644
--- a/Bio/DB/GFF/Typename.pm
+++ b/Bio/DB/GFF/Typename.pm
@@ -52,7 +52,7 @@ sub new    {
   my ($method,$source) = @_;
   $method ||= '';
   $source ||= '';
-  if ($source eq '' && $method =~ /^([\w-]+):([\w-]*)$/) {
+  if ($source eq '' && $method =~ /^([\w-\.]+):([\w-\.]*)$/) {
     $method = $1;
     $source = $2;
   }
diff --git a/Bio/DB/GenBank.pm b/Bio/DB/GenBank.pm
index b7f94ff..a19a8fd 100644
--- a/Bio/DB/GenBank.pm
+++ b/Bio/DB/GenBank.pm
@@ -98,7 +98,7 @@ evaluating to TRUE.
 =head2 Running
 
 Alternate methods are described at
-L<http://www.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html>
+L<https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch>
 
 NOTE: strand should be 1 for plus or 2 for minus.
 
diff --git a/Bio/DB/MeSH.pm b/Bio/DB/MeSH.pm
index 45da4d4..1e9bd65 100644
--- a/Bio/DB/MeSH.pm
+++ b/Bio/DB/MeSH.pm
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::DB::MeSH
 #
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
+# Please direct questions and support issues to <bioperl-l at bioperl.org>
 #
 # Cared for by Heikki Lehvaslaiho, heikki-at-bioperl-dot-org
 #
@@ -22,16 +22,17 @@ Bio::DB::MeSH - Term retrieval from a Web MeSH database
 =head1 DESCRIPTION
 
 This class retrieves a term from the Medical Subject Headings database
-by the National Library of Medicine of USA. 
-See L<http://www.nlm.nih.gov/mesh/meshhome.html>.
+by the National Library of Medicine of USA. See
+L<http://www.nlm.nih.gov/mesh/meshhome.html>. It uses the latest
+data available (updates happen on weekdays). If it fails, an archive
+cgi scripts accessing older data from previous year is used.
 
 This class implements L<Bio::SimpleAnalysisI> and wraps its methods under
 L<get_exact_term>.
 
 By default, web access uses L<WWW::Mechanize>, but in its absence
 falls back to bioperl module L<Bio::WebAgent> which is a subclass of
-L<LWP::UserAgent>. If not even that is not installed, it uses
-L<Bio::Root::HTTPget>.
+L<LWP::UserAgent>.
 
 =head1 SEE ALSO
 
@@ -48,15 +49,15 @@ Bioperl mailing lists Your participation is much appreciated.
   bioperl-l at bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l at bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -110,26 +111,35 @@ my  $RESULT_SPEC =
 
 
 sub _init {
+    # Note: Base URL is now set in _webmodule(), depending on which is selected
     my $self = shift;
-    $self->url($URL);
-    $self->{'_ANALYSIS_SPEC'} =$ANALYSIS_SPEC;
-    $self->{'_INPUT_SPEC'} =$INPUT_SPEC;
-    $self->{'_RESULT_SPEC'} =$RESULT_SPEC;
+    $self->{'_ANALYSIS_SPEC'} = $ANALYSIS_SPEC;
+    $self->{'_INPUT_SPEC'}    = $INPUT_SPEC;
+    $self->{'_RESULT_SPEC'}   = $RESULT_SPEC;
     $self->{'_ANALYSIS_NAME'} = $ANALYSIS_SPEC->{'name'};
     $self->_webmodule;
     return $self;
 }
 
+
 sub _webmodule {
     my ($self) = shift;
     $self->{'_webmodule'} = '';
+
+    # Prefer WWW::Mechanize if available and use $URL
     eval {
         require WWW::Mechanize;
     };
     unless ($@) {
         $self->{'_webmodule'} = 'WWW::Mechanize';
+        $self->url($URL);
         return;
     }
+
+    # Bio::WebAgent uses cgi alternative URL
+    $self->_set_cgi_base_url;
+
+    # Use Bio::WebAgent alternative
     eval {
         require LWP::UserAgent;
     };
@@ -137,9 +147,37 @@ sub _webmodule {
         $self->{'_webmodule'} = 'Bio::WebAgent';
         return;
     }
-    require Bio::Root::HTTPget;
-    $self->{'_webmodule'} = 'Bio::Root::HTTPget';
-    1;
+
+    $self->throw("Bio::DB::MeSH needs either WWW::Mechanize or Bio::WebAgent");
+}
+
+
+sub _set_cgi_base_url {
+    my ($self) = shift;
+
+    # Try to get webpage corresponding to current year.
+    # If it fails, try to get previous years until success or 2003
+    my $year = 1900 + (localtime)[5];
+    my $pass = 0;
+    while ($pass == 0 and $year > 2003) {
+        my $response;
+        eval {
+            $response = $self->get( "http://www.nlm.nih.gov/cgi/mesh/$year/MB_cgi" )
+        };
+        # Note: error 404 is acceptable because it can mean that webpage is not yet
+        # implemented for current year. Absence of internet generates error 500.
+        if ($@ or $response->{'_rc'} > 404) {
+            $self->warn("Could not connect to the server\n") and return;
+        }
+        # Success closes the loop, fail makes it try with the another year
+        if ($response->is_success) {
+            $pass = 1;
+        }
+        else {
+            $year -= 1;
+        }
+    }
+    $self->url("http://www.nlm.nih.gov/cgi/mesh/$year/MB_cgi");
 }
 
 =head2 get_exact_term
@@ -180,9 +218,11 @@ sub run {
 
 
 sub _cgi_url {
-  my($self, $field, $term) = @_;
-  # we don't bother to URI::Escape $field and $term as this is an untainted private sub
-  return 'http://www.nlm.nih.gov/cgi/mesh/2003/MB_cgi?field='.$field.'&term='.$term;
+    my($self, $field, $term) = @_;
+
+    # we don't bother to URI::Escape $field and $term as this is an untainted private sub
+    my $base_url = $self->url;
+    return "$base_url?field=$field&term=$term";
 }
 
 
@@ -239,28 +279,10 @@ sub  _run {
             $self->status('COMPLETED');
         }
         return;
-    } else {
-        $self->debug("using Bio::Root::HTTPget...\n");
-        my $agent = Bio::Root::HTTPget->new();
-        if ($value =~ /\w\d{6}/) {
-            $self->{'_content'} =
-                eval {
-                    $agent->get( $self->_cgi_url('uid', $value) )
-                };
-            $self->warn("Could not connect to the server\n") and return
-                if $@;
-        } else {
-            $self->{'_content'} =
-                eval {
-                    $agent->get( $self->_cgi_url('entry', $value) )
-                };
-            $self->debug("Could not connect to the server\n") and return
-                if $@;
-        }
-        $self->status('COMPLETED');
     }
 }
 
+
 sub result {
     my ($self,$value) = @_;
 
diff --git a/Bio/DB/SeqVersion/gi.pm b/Bio/DB/SeqVersion/gi.pm
index 1b1b434..93741e5 100644
--- a/Bio/DB/SeqVersion/gi.pm
+++ b/Bio/DB/SeqVersion/gi.pm
@@ -41,14 +41,14 @@ All sequence entries at GenBank are identified by a pair of
 identifiers, an accession and a numeric identifier, and this number is
 frequently called a GI number (B<G>enInfo B<I>dentifier). The accession
 is stable, but each new version of the sequence entry for the accession
-receives a new GI number (see L<http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html>
+receives a new GI number (see L<https://www.ncbi.nlm.nih.gov/genbank/sequenceids/#historical_note>
 for more information on GenBank identifiers). One accession
 can have one or more GI numbers and the highest of these is the most recent,
 or "live", GI.
 
 Information on an accession and its associated GI numbers is available at
 the Sequence Revision History page at NCBI,
-L<http://www.ncbi.nlm.nih.gov/entrez/sutils/girevhist.cgi>, this information is
+L<https://www.ncbi.nlm.nih.gov/genbank/sequencerevisionhistory/>, this information is
 not available in file format. This module queries the Web page and retrieves GI
 numbers and related data given an accession (e.g. NP_111111, A11111, P12345) or
 a GI number (e.g. 2, 11111111) as query.
@@ -109,7 +109,7 @@ use base qw(Bio::DB::SeqVersion);
 # Private class variables
 
 # TODO: this may be an unstable setting (text is actually minimal XHTML)
-my $URL = 'http://www.ncbi.nlm.nih.gov/nuccore/%s?report=girevhist&format=text';
+my $URL = 'https://www.ncbi.nlm.nih.gov/nuccore/%s?report=girevhist&format=text';
 
 =head2 new
 
diff --git a/Bio/DB/Taxonomy/entrez.pm b/Bio/DB/Taxonomy/entrez.pm
index ffc0dac..67d255f 100644
--- a/Bio/DB/Taxonomy/entrez.pm
+++ b/Bio/DB/Taxonomy/entrez.pm
@@ -321,7 +321,6 @@ sub get_taxon {
         $taxonid = join(',', @uncached);
         
         $p{'id'} = $taxonid;
-        $self->debug("id is $taxonid\n");
 
         my $twig = $self->_run_query($self->_build_url($EntrezFetch, \%p));
         my $root = $twig->root;
@@ -357,35 +356,37 @@ sub get_taxon {
             # requested node, we may as well cache data for the ancestors to
             # reduce the number of accesses to website in future
             my $lineage_ex = $taxon->first_child('LineageEx');
-            my ($ancestor, $lineage_data, @taxa);
-            foreach my $lineage_taxon ($lineage_ex->children) {
-                my $lineage_taxid = $lineage_taxon->first_child_text('TaxId');
-                
-                if (exists $DATA_CACHE->{minimal_info}->{$lineage_taxid} || exists $DATA_CACHE->{full_info}->{$lineage_taxid}) {
-                    $lineage_data = $DATA_CACHE->{minimal_info}->{$lineage_taxid} || $DATA_CACHE->{full_info}->{$lineage_taxid};
-                    next;
-                }
-                else {
-                    $lineage_data = {};
-                }
-                
-                $lineage_data->{id} = $lineage_taxid;
-                $lineage_data->{scientific_name} = $lineage_taxon->first_child_text('ScientificName');
-                $lineage_data->{rank} = $lineage_taxon->first_child_text('Rank');
-                
-                $RELATIONS->{ancestors}->{$lineage_taxid} = $ancestor->{id} if $ancestor;
-                
-                $DATA_CACHE->{minimal_info}->{$lineage_taxid} = $lineage_data;
-            } continue { $ancestor = $lineage_data; unshift(@taxa, $lineage_data); }
-            
-            $RELATIONS->{ancestors}->{$taxid} = $ancestor->{id} if $ancestor;
-            
-            # go through the lineage in reverse so we can remember the children
-            my $child = $data;
-            foreach my $lineage_data (@taxa) {
-                $RELATIONS->{children}->{$lineage_data->{id}}->{$child->{id}} = 1;
-            } continue { $child = $lineage_data; }
+            if (defined $lineage_ex) {
+                my ($ancestor, $lineage_data, @taxa);
+                foreach my $lineage_taxon ($lineage_ex->children) {
+                    my $lineage_taxid = $lineage_taxon->first_child_text('TaxId');
+                    
+                    if (exists $DATA_CACHE->{minimal_info}->{$lineage_taxid} || exists $DATA_CACHE->{full_info}->{$lineage_taxid}) {
+                        $lineage_data = $DATA_CACHE->{minimal_info}->{$lineage_taxid} || $DATA_CACHE->{full_info}->{$lineage_taxid};
+                        next;
+                    }
+                    else {
+                        $lineage_data = {};
+                    }
+                    
+                    $lineage_data->{id} = $lineage_taxid;
+                    $lineage_data->{scientific_name} = $lineage_taxon->first_child_text('ScientificName');
+                    $lineage_data->{rank} = $lineage_taxon->first_child_text('Rank');
+                    
+                    $RELATIONS->{ancestors}->{$lineage_taxid} = $ancestor->{id} if $ancestor;
+                    
+                    $DATA_CACHE->{minimal_info}->{$lineage_taxid} = $lineage_data;
+                } continue { $ancestor = $lineage_data; unshift(@taxa, $lineage_data); }
             
+                $RELATIONS->{ancestors}->{$taxid} = $ancestor->{id} if $ancestor;
+
+                # go through the lineage in reverse so we can remember the children
+                my $child = $data;
+                foreach my $lineage_data (@taxa) {
+                    $RELATIONS->{children}->{$lineage_data->{id}}->{$child->{id}} = 1;
+                } continue { $child = $lineage_data; }
+            }
+
             delete $DATA_CACHE->{minimal_info}->{$taxid};
             $DATA_CACHE->{full_info}->{$taxid} = $data;
             push(@results, $self->_make_taxon($data));
diff --git a/Bio/Index/Stockholm.pm b/Bio/Index/Stockholm.pm
index 2b39c2c..84e8328 100644
--- a/Bio/Index/Stockholm.pm
+++ b/Bio/Index/Stockholm.pm
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::Index::Stockholm
 #
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
+# Please direct questions and support issues to <bioperl-l at bioperl.org>
 #
 # Cared for by Chris Fields <cjfields at uiuc.edu>
 #
@@ -34,8 +34,8 @@ Bio::Index::Stockholm
 
 =head1 DESCRIPTION
 
-Indexes Stockholm format alignments such as those from Pfam and Rfam.  
-Returns raw stream data using the ID or a Bio::SimpleAlign object 
+Indexes Stockholm format alignments such as those from Pfam and Rfam.
+Returns raw stream data using the ID or a Bio::SimpleAlign object
 (via Bio::AlignIO).
 
 This module also allows for ID parsing using a callback:
@@ -72,15 +72,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l at bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l at bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -123,7 +123,7 @@ sub _version {
                 -verbose     => 0);
 
   Function: Returns a new index object.  If filename is
-            specified, then open_dbm() is immediately called. 
+            specified, then open_dbm() is immediately called.
             Bio::Index::Abstract->new() will usually be called
             directly only when opening an existing index.
   Returns : A new index object
@@ -153,7 +153,7 @@ sub new {
 
  Title   : fetch_report
  Usage   : my $align = $idx->fetch_report($id);
- Function: Returns a Bio::SimpleAlign object 
+ Function: Returns a Bio::SimpleAlign object
            for a specific alignment
  Returns : Bio::SimpleAlign
  Args    : valid id
@@ -173,7 +173,7 @@ sub fetch_report{
 
  Title   : fetch_aln
  Usage   : my $align = $idx->fetch_aln($id);
- Function: Returns a Bio::SimpleAlign object 
+ Function: Returns a Bio::SimpleAlign object
            for a specific alignment
  Returns : Bio::SimpleAlign
  Args    : valid id
@@ -194,9 +194,9 @@ sub fetch_report{
   Function: Specialist function to index report file(s).
             Is provided with a filename and an integer
             by make_index in its SUPER class.
-  Example : 
-  Returns : 
-  Args    : 
+  Example :
+  Returns :
+  Args    :
 
 =cut
 
@@ -213,7 +213,7 @@ sub _index_file {
   open my $STOCKHOLM, '<', $file or $self->throw("Could not read file '$file': $!");
 
   my %done_ids;
-    
+
   # In Windows, text files have '\r\n' as line separator, but when reading in
   # text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
   # "length $_" will report 4 although the line is 5 bytes in length.
@@ -235,7 +235,7 @@ sub _index_file {
         $done_ids{$id} = 1;
       }
 
-      %done_ids = () if ( m{//} );    
+      %done_ids = () if ( m{//} );
   }
   close $STOCKHOLM;
 
@@ -280,10 +280,10 @@ sub id_parser {
 sub default_id_parser {
   my $line = shift;
   my %accs;
-    
+
   if ( $line =~ /^#=GF AC\s+(\S+)/ ) {
     $accs{$1}++;
-  } 
+  }
   keys %accs;
 }
 
@@ -318,11 +318,11 @@ sub default_id_parser {
  Usage   : $value = $self->dbm_package();
            $self->dbm_package($value);
 
- Function: Gets or sets the name of the Perl dbm module used. 
+ Function: Gets or sets the name of the Perl dbm module used.
            If the value is unset, then it returns the value of
            the package variable $USE_DBM_TYPE or if that is
            unset, then it chooses the best available dbm type,
-           choosing 'DB_File' in preference to 'SDBM_File'. 
+           choosing 'DB_File' in preference to 'SDBM_File'.
            Bio::Abstract::Index may work with other dbm file
            types.
 
@@ -339,10 +339,10 @@ sub default_id_parser {
            at the approprite place
 
            This provides for a way to get the actual
-           file contents and not an object 
+           file contents and not an object
 
            WARNING: you must parse the record deliminter
-           *yourself*. Abstract wont do this for you 
+           *yourself*. Abstract wont do this for you
            So this code
 
            $fh = $index->get_stream($myid);
@@ -359,7 +359,7 @@ sub default_id_parser {
 
  Returns : A filehandle object
  Args    : string represents the accession number
- Notes   : This method should not be used without forethought 
+ Notes   : This method should not be used without forethought
 
 
 =head2 open_dbm
@@ -369,7 +369,7 @@ sub default_id_parser {
             object.  Write access is only given if explicitly
             asked for by calling new(-write => 1) or having set
             the write_flag(1) on the index object.  The type of
-            dbm file opened is that returned by dbm_package(). 
+            dbm file opened is that returned by dbm_package().
             The name of the file to be is opened is obtained by
             calling the filename() method.
 
@@ -385,8 +385,8 @@ sub default_id_parser {
             index module.  Used to permanently identify an index
             file as having been created by a particular version
             of the index module.  Must be provided by the sub class
-  Example : 
-  Returns : 
+  Example :
+  Returns :
   Args    : none
 
 =head2 _filename
@@ -394,9 +394,9 @@ sub default_id_parser {
   Title   : _filename
   Usage   : $index->_filename( FILE INT )
   Function: Indexes the file
-  Example : 
-  Returns : 
-  Args    : 
+  Example :
+  Returns :
+  Args    :
 
 =head2 _file_handle
 
@@ -419,7 +419,7 @@ sub default_id_parser {
             track the number of files indexed.  Sets or gets
             the number of files indexed when called with or
             without an argument.
-  Example : 
+  Example :
   Returns : INT
   Args    : INT
 
@@ -443,7 +443,7 @@ sub default_id_parser {
   Usage   : $packed_string = $index->pack_record( LIST )
   Function: Packs an array of scalars into a single string
             joined by ASCII 034 (which is unlikely to be used
-            in any of the strings), and returns it. 
+            in any of the strings), and returns it.
   Example : $packed_string = $index->pack_record( $fileNumber, $begin, $end )
   Returns : STRING or undef
   Args    : LIST
diff --git a/Bio/Restriction/IO/prototype.pm b/Bio/Restriction/IO/prototype.pm
index 6549a98..db04f27 100644
--- a/Bio/Restriction/IO/prototype.pm
+++ b/Bio/Restriction/IO/prototype.pm
@@ -121,7 +121,7 @@ sub read {
         
         my $precut;
         if ($site =~ /,/) {
-            $self->warn("Split site support not present for Bio::Restriction::Enzyme yet,".
+            $self->warn("Split site support not available for Bio::Restriction::Enzyme yet, ".
                         "skipping $enzyme [$site]");
             next ENZYME;
         }
diff --git a/Bio/Root/IO.pm b/Bio/Root/IO.pm
index df68078..541a8ed 100644
--- a/Bio/Root/IO.pm
+++ b/Bio/Root/IO.pm
@@ -7,6 +7,9 @@ use File::Copy;
 use Fcntl;
 use base qw(Bio::Root::Root);
 
+# as of 2016, worked on most systems, but will test this in a RC
+my %modes = ( 0 => 'r', 1 => 'w', 2 => 'rw' );
+
 =head1 SYNOPSIS
 
     # Use stream I/O in your module
@@ -350,16 +353,22 @@ sub mode {
         my $mode;
         my $fh = $self->_fh;
         if (defined $fh) {
-            # Determine read/write status of filehandle
-            no warnings 'io';
-            if ( defined( read $fh, my $content, 0 ) ) {
-                # Successfully read 0 bytes
-                $mode = 'r'
-            }
-            if ( defined( syswrite $fh, '') ) {
-                # Successfully wrote 0 bytes
-                $mode ||= '';
-                $mode  .= 'w';
+            # use fcntl if not Windows-based
+            if ($^O !~ /MSWin32/) {
+                my $m = fcntl($fh, F_GETFL, 0);
+                $mode = exists $modes{$m & 3}  ? $modes{$m & 3} : '?';
+            } else {
+                # Determine read/write status of filehandle
+                no warnings 'io';
+                if ( defined( read $fh, my $content, 0 ) ) {
+                    # Successfully read 0 bytes
+                    $mode = 'r'
+                }
+                if ( defined( syswrite $fh, '') ) {
+                    # Successfully wrote 0 bytes
+                    $mode ||= '';
+                    $mode  .= 'w';
+                }
             }
         } else {
            # Stream does not have a filehandle... cannot determine mode
diff --git a/Bio/Root/Version.pm b/Bio/Root/Version.pm
index 93d65fa..1c17082 100644
--- a/Bio/Root/Version.pm
+++ b/Bio/Root/Version.pm
@@ -36,7 +36,7 @@ variable set if it's not already.
 
 =cut
 
-our $VERSION = '1.007000_004';
+our $VERSION = '1.007000';
 
 sub import {
     # try to handle multiple levels of inheritance:
diff --git a/Bio/Search/Hit/GenericHit.pm b/Bio/Search/Hit/GenericHit.pm
index eee354a..bc23088 100644
--- a/Bio/Search/Hit/GenericHit.pm
+++ b/Bio/Search/Hit/GenericHit.pm
@@ -1702,7 +1702,10 @@ sub query_length {
            if available, for the hit
  Returns : a scalar string (empty string if not set)
  Args    : none
-
+ Note    : As of Sept. 2016 NCBI records will no longer have a
+           GI; this attributue will remain in place for older
+           records
+           
 =cut
 
 sub ncbi_gi {
diff --git a/Bio/Search/Hit/ModelHit.pm b/Bio/Search/Hit/ModelHit.pm
index 1a7027a..a1f3233 100644
--- a/Bio/Search/Hit/ModelHit.pm
+++ b/Bio/Search/Hit/ModelHit.pm
@@ -548,6 +548,9 @@ sub query_length {
            if available, for the hit
  Returns : a scalar string (empty string if not set)
  Args    : none
+ Note    : As of Sept. 2016 NCBI records will no longer have a
+           GI; this attributue will remain in place for older
+           records
 
 =cut
 
diff --git a/Bio/Search/Result/GenericResult.pm b/Bio/Search/Result/GenericResult.pm
index 9df72e4..4acc305 100644
--- a/Bio/Search/Result/GenericResult.pm
+++ b/Bio/Search/Result/GenericResult.pm
@@ -756,8 +756,8 @@ sub program_reference { shift->algorithm_reference(@_); }
  Comments: The default implementation in ResultI returns an empty string
            rather than throwing a NotImplemented exception, since
            the RID may not always be available and is not critical.
-           See: (1) http://www.ncbi.nlm.nih.gov/Class/MLACourse/Modules/BLAST/rid.html
-                (2) http://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/node63.html
+           See: (1) https://www.ncbi.nlm.nih.gov/Class/MLACourse/Modules/BLAST/rid.html
+                (2) https://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/node63.html
 =cut
 
 sub rid{
diff --git a/Bio/Search/Result/ResultI.pm b/Bio/Search/Result/ResultI.pm
index 4a2a8fb..aa392b2 100644
--- a/Bio/Search/Result/ResultI.pm
+++ b/Bio/Search/Result/ResultI.pm
@@ -442,8 +442,8 @@ sub algorithm_reference{
  Comments: The default implementation in ResultI returns an empty string
            rather than throwing a NotImplemented exception, since
            the RID may not always be available and is not critical.
-           See: (1) http://www.ncbi.nlm.nih.gov/Class/MLACourse/Modules/BLAST/rid.html
-                (2) http://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/node63.html
+           See: (1) https://www.ncbi.nlm.nih.gov/Class/MLACourse/Modules/BLAST/rid.html
+                (2) https://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/node63.html
 =cut
 
 sub rid{
diff --git a/Bio/SearchIO/Writer/HTMLResultWriter.pm b/Bio/SearchIO/Writer/HTMLResultWriter.pm
index ee6b279..488f804 100644
--- a/Bio/SearchIO/Writer/HTMLResultWriter.pm
+++ b/Bio/SearchIO/Writer/HTMLResultWriter.pm
@@ -114,8 +114,8 @@ BEGIN {
     $Revision = '$Id$';
     $DATE = localtime(time);
     %RemoteURLDefault = ( 
-      'PROTEIN' => 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=protein&cmd=search&term=%s',			  
-      'NUCLEOTIDE' => 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=nucleotide&cmd=search&term=%s'
+      'PROTEIN' => 'https://www.ncbi.nlm.nih.gov/protein?term=%s',			  
+      'NUCLEOTIDE' => 'https://www.ncbi.nlm.nih.gov/nucleotide?term=%s'
     );
     $MaxDescLen = 60;
     $AlignmentLineWidth = 60;
diff --git a/Bio/SeqFeature/Tools/Unflattener.pm b/Bio/SeqFeature/Tools/Unflattener.pm
index 8aa5517..bf7e0cb 100644
--- a/Bio/SeqFeature/Tools/Unflattener.pm
+++ b/Bio/SeqFeature/Tools/Unflattener.pm
@@ -2401,7 +2401,7 @@ sub _resolve_container_for_sf{
 
 
        # SPECIAL CASE FOR /ribosomal_slippage
-       # See: http://www.ncbi.nlm.nih.gov/collab/FT/
+       # See: https://www.ncbi.nlm.nih.gov/collab/FT/
        if (!$inside && $sf->has_tag('ribosomal_slippage')) {
 	   if ($self->verbose > 0) {
 	       printf STDERR "    Checking for ribosomal_slippage\n";
diff --git a/Bio/SeqIO.pm b/Bio/SeqIO.pm
index 9cd3581..a855249 100644
--- a/Bio/SeqIO.pm
+++ b/Bio/SeqIO.pm
@@ -147,8 +147,9 @@ conventions apply:
    '>file'      # open file for writing
    '>>file'     # open file for appending
    '+<file'     # open file read/write
-   'command |'  # open a pipe from the command
-   '| command'  # open a pipe to the command
+
+To read from or write to a piped command, open a filehandle and use the -fh
+option.
 
 =item -fh
 
@@ -179,6 +180,19 @@ some HTML tags:
       print $string;
   }
 
+Filehandles can also be used to read from or write to a piped command:
+
+  use Bio::SeqIO;
+  #convert .fastq.gz to .fasta
+  open my $zcat, 'zcat seq.fastq.gz |' or die $!;
+  my $in=Bio::SeqIO->new(-fh=>$zcat,
+                         -format=>'fastq');
+  my $out=Bio::SeqIO->new(-file=>'>seq.fasta',
+                          -format=>'fasta');
+  while (my $seq=$in->next_seq) {
+      $out->write_seq($seq) 
+  }
+
 =item -string
 
 A string to read the sequences from. For example:
diff --git a/Bio/SeqIO/bsml.pm b/Bio/SeqIO/bsml.pm
index 7026188..0ea41ed 100644
--- a/Bio/SeqIO/bsml.pm
+++ b/Bio/SeqIO/bsml.pm
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::SeqIO::bsml
 #
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
+# Please direct questions and support issues to <bioperl-l at bioperl.org>
 #
 # Cared for by Charles Tilford (tilfordc at bms.com)
 # Copyright (C) Charles Tilford 2001
@@ -21,11 +21,9 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 # Also at:   http://www.gnu.org/copyleft/lesser.html
 
-
 # Much of the basic documentation in this module has been
 # cut-and-pasted from the embl.pm (Ewan Birney) SeqIO module.
 
-
 =head1 NAME
 
 Bio::SeqIO::bsml - BSML sequence input/output stream
@@ -78,15 +76,15 @@ of the Bioperl mailing lists.  Your participation is much appreciated.
   bioperl-l at bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l at bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -247,7 +245,7 @@ sub next_seq {
     my %specs = ('common_name' => 'y',
 		 'genus'       => 'y',
 		 'species'     => 'y',
-		 'sub_species' => 'y', 
+		 'sub_species' => 'y',
 		 );
     my %seqMap = (
 		  'add_date'     => [ qw(date date-created date-last-updated)],
@@ -281,7 +279,7 @@ sub next_seq {
 		$value ||= $content if ($name =~ /$match/i);
 	    }
 	    if ($value ne "") {
-		
+
 		if( $method eq 'seq_version'&& $value =~ /\S+\.(\d+)/ ) {
 		    # hack for the fact that data in version is actually
 		    # ACCESSION.VERSION
@@ -355,30 +353,29 @@ sub next_seq {
 		-location => "RefJournal",
 		);
     for my $ref ( $xmlSeq->getElementsByTagName ("Reference") ) {
-	my %refVals;
-	for my $tag (keys %tags) {
-	    my $rt = &FIRSTDATA($ref->getElementsByTagName($tags{$tag})
-				->item(0));
-	    next unless ($rt);
-	    $rt =~ s/^[\s\r\n]+//; # Kill leading space
-	    $rt =~ s/[\s\r\n]+$//; # Kill trailing space
-	    $rt =~ s/[\s\r\n]+/ /; # Collapse internal space runs
-	    $refVals{$tag} = $rt;
-	}
+		my %refVals;
+		for my $tag (keys %tags) {
+	    	my $rt = &FIRSTDATA($ref->getElementsByTagName($tags{$tag})->item(0));
+	    	next unless ($rt);
+	    	$rt =~ s/^[\s\r\n]+//; # Kill leading space
+	    	$rt =~ s/[\s\r\n]+$//; # Kill trailing space
+	    	$rt =~ s/[\s\r\n]+/ /; # Collapse internal space runs
+	    	$refVals{$tag} = $rt;
+		}
 	my $reference = Bio::Annotation::Reference->new( %refVals );
-	
+
 	# Pull out any <Reference> information hidden in <Attributes>
 	my %refMap = (
 		      comment         => [ 'comment', 'remark' ],
 		      medline         => [ 'medline', ],
 		      pubmed          => [ 'pubmed' ],
 		      start           => [ 'start', 'begin' ],
-		      end             => [ 'stop', 'end' ],		      
+		      end             => [ 'stop', 'end' ],
 		      );
 	my @refCom = ();
 	my $floppies = &GETFLOPPIES($ref);
 	for my $attr (@{$floppies}) {
-	    my ($name, $content) = &FLOPPYVALS($attr);	    
+	    my ($name, $content) = &FLOPPYVALS($attr);
 	    my $value = "";
 	    # Cycle through the Seq methods:
 	    for my $method (keys %refMap) {
@@ -412,12 +409,12 @@ sub next_seq {
     for my $feat ( $xmlSeq->getElementsByTagName("Feature") ) {
 	$bioSeq->add_SeqFeature( $self->_parse_bsml_feature($feat) );
     }
-    
+
     $species->classification( @classification );
     $bioSeq->species( $species );
-    
+
     $bioSeq->annotation->add_Annotation('dblink' => $_) for @links;
-    
+
     $self->{'current_node'}++;
     return $bioSeq;
 }
@@ -999,7 +996,7 @@ sub _parse_bsml_feature {
     for my $attr (@{$floppies}) {
 	my ($name, $content) = &FLOPPYVALS($attr);
 	# Don't know what the object is, dump it to a tag:
-	$basegsf->add_tag_value(lc($name), $content);	
+	$basegsf->add_tag_value(lc($name), $content);
     }
 
     # Mostly this helps with debugging, but may be of utility...
diff --git a/Bio/SeqIO/embl.pm b/Bio/SeqIO/embl.pm
index d3615d5..b35b63a 100644
--- a/Bio/SeqIO/embl.pm
+++ b/Bio/SeqIO/embl.pm
@@ -554,8 +554,8 @@ sub _write_ID_line {
 
         $mol ||= '';            # 'unassigned'; ?
         $id_line = "ID   $name; SV $version; $topology; $mol; STD; $div; $len BP.\nXX\n";
-        $self->_print($id_line);
     }
+    $self->_print($id_line);
 }
 
 =head2 _is_valid_division
@@ -1356,14 +1356,33 @@ sub _read_FTHelper_EMBL {
 
     # Now parse and add any qualifiers.  (@qual is kept
     # intact to provide informative error messages.)
+    my $last_unquoted_qualifier;
   QUAL:
     for (my $i = 0; $i < @qual; $i++) {
         my $data = $qual[$i];
-        my ( $qualifier, $value ) = ($data =~ m{^/([^=]+)(?:=\s*(.+))?})
-            or $self->throw("Can't see new qualifier in: $_\nfrom:\n"
+        my ( $qualifier, $value );
+	
+	unless (( $qualifier, $value ) = ($data =~ m{^/([^=]+)(?:=\s*(.*))?})) {
+	   if ( defined $last_unquoted_qualifier ) {
+	      # handle case of unquoted multiline - read up everything until the next qualifier
+	      do {
+                 # Protein sequence translations need to be joined without spaces,
+                 # other qualifiers need those.
+		 $value .= ' ' if $qualifier ne "translation";
+                 $value .= $data;
+	      } while defined($data = $qual[++$i]) && $data !~ m[^/];
+	      $i--;
+              $out->field->{$last_unquoted_qualifier}->[-1] .= $value;
+              $last_unquoted_qualifier = undef;
+	      next QUAL;
+	   } else {
+              $self->throw("Can't see new qualifier in: $_\nfrom:\n"
                             . join('', map "$_\n", @qual));
+	   }
+	}
         $qualifier = '' if not defined $qualifier;
 
+        $last_unquoted_qualifier = undef;
         if (defined $value) {
             # Do we have a quoted value?
             if (substr($value, 0, 1) eq '"') {
@@ -1393,7 +1412,9 @@ sub _read_FTHelper_EMBL {
                 $value =~ s/^"|"$//g;
                 # Undouble internal quotes
                 $value =~ s/""/"/g; #"
-            }
+            } else {
+              $last_unquoted_qualifier = $qualifier;
+	    }
         } else {
             $value = '_no_value';
         }
diff --git a/Bio/SeqIO/tinyseq.pm b/Bio/SeqIO/tinyseq.pm
index 2b9d7f5..3712c5b 100644
--- a/Bio/SeqIO/tinyseq.pm
+++ b/Bio/SeqIO/tinyseq.pm
@@ -30,7 +30,7 @@ This object reads and writes Bio::Seq objects to and from TinySeq XML
 format.  A TinySeq is a lightweight XML file of sequence information,
 analgous to FASTA format.
 
-See L<http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.mod.dtd> for the DTD.
+See L<https://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.mod.dtd> for the DTD.
 
 =head1 FEEDBACK
 
@@ -353,7 +353,7 @@ sub _get_writer {
                                       DATA_INDENT => 2,
                                       NEWLINE     => 1,
                                       );
-        $writer->doctype('TSeqSet', '-//NCBI//NCBI TSeq/EN', 'http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd');
+        $writer->doctype('TSeqSet', '-//NCBI//NCBI TSeq/EN', 'https://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd');
         $writer->comment("Generated by Bio::SeqIO::tinyseq VERSION " . $Bio::Root::Version::VERSION);
         $writer->startTag('TSeqSet');
 
diff --git a/Bio/SeqIO/tinyseq/tinyseqHandler.pm b/Bio/SeqIO/tinyseq/tinyseqHandler.pm
index c207120..52bcd22 100644
--- a/Bio/SeqIO/tinyseq/tinyseqHandler.pm
+++ b/Bio/SeqIO/tinyseq/tinyseqHandler.pm
@@ -31,7 +31,7 @@ in the NCBI TinySeq XML format.  A TinySeq is a lightweight XML file
 of sequence information on one or more sequences, analgous to FASTA
 format.
 
-See L<http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.mod.dtd> for the DTD.
+See L<https://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.mod.dtd> for the DTD.
 
 =head1 FEEDBACK
 
@@ -120,13 +120,13 @@ sub new {
 }
 
 #######################################
-# Event hadling methods for PerlSax   #
+# Event handling methods for PerlSax  #
 #######################################
 
 sub doctype_decl {
     my ($self, $doctype) = @_;
     # make sure we have a tinyseq
-    unless ($doctype->{'SystemId'} eq 'http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd') {
+    unless ($doctype->{'SystemId'} eq 'https://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd') {
 	$self->throw("This document doesn't use the NCBI TinySeq dtd; it's a ", $doctype->{'SystemId'} );
     }
 
diff --git a/Bio/Tools/CodonTable.pm b/Bio/Tools/CodonTable.pm
index 3bbc194..937c2dd 100644
--- a/Bio/Tools/CodonTable.pm
+++ b/Bio/Tools/CodonTable.pm
@@ -128,7 +128,7 @@ only differences are in available initiator codons.
 
 NCBI Genetic Codes home page:
      (Last update of the Genetic Codes: April 30, 2013)
-     http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=c
+     https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=c
 
 ASN.1 version with ids 1 to 25 is at:
      ftp://ftp.ncbi.nih.gov/entrez/misc/data/gc.prt
@@ -726,7 +726,31 @@ sub is_start_codon{
 =cut
 
 sub is_ter_codon{
-    shift->_codon_is( shift, \@TABLES, $TERMINATOR );
+   my ($self, $value) = @_;
+   my $id = $self->{'id'};
+
+   # We need to ensure U is mapped to T (ie. UAG)
+   $value = uc $value;
+   $value =~ tr/U/T/;
+
+   if (length $value != 3  )  {
+       # Incomplete codons are not stop codons
+       return 0;
+   } else {
+       my $result = 0;
+
+       # For all the possible codons, if any are not a stop
+       # codon, fail immediately
+       for my $c ( $self->unambiguous_codons($value) ) {
+	   my $m = substr( $TABLES[$id], $CODONS->{$c}, 1 );
+	   if($m eq $TERMINATOR) {
+	       $result = 1;
+	   } else {
+	       return 0;
+	   }
+       }
+       return $result;
+   }
 }
 
 # desc: compares the passed value with a single entry in the given
diff --git a/Bio/Tools/ERPIN.pm b/Bio/Tools/ERPIN.pm
deleted file mode 100644
index 302ef99..0000000
--- a/Bio/Tools/ERPIN.pm
+++ /dev/null
@@ -1,350 +0,0 @@
-#
-# BioPerl module for Bio::Tools::ERPIN
-#
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
-#
-# Cared for by Chris Fields <cjfields-at-uiuc-dot-edu>
-#
-# Copyright Chris Fields
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
-
-Bio::Tools::ERPIN -  a parser for ERPIN output
-
-=head1 SYNOPSIS
-
-  use Bio::Tools::ERPIN;
-  my $parser = Bio::Tools::ERPIN->new( -file => $rna_output,
-                                      -motiftag => 'protein_bind'
-                                      -desctag => 'TRAP_binding');
-  #parse the results
-  while( my $motif = $parser->next_prediction) {
-    # do something here
-  }
-
-=head1 DESCRIPTION
-
-Parses raw ERPIN output.
-
-This module is not currently complete.  As is, it will parse raw
-ERPIN long format output and pack information into
-Bio::SeqFeature::Generic objects.  
-
-Several values have also been added in the 'tag' hash.  These can be
-accessed using the following syntax:
-
-  my ($entry) = $feature->get_Annotations('SecStructure');
-
-Added tags are : 
-   tset         - training set used for the sequence
-   tsetdesc     - training set description line
-   cutoff       - cutoff value used
-   database     - name of database
-   dbdesc       - description of database
-   dbratios     - nucleotide ratios of database (used to calculate evalue)
-   descline     - entire description line (in case the regex used for
-                  sequence ID doesn't adequately catch the name
-   accession    - accession number of sequence (if present)
-   logodds      - logodds score value
-   sequence     - sequence from hit, separated based on training set
-
-See t/ERPIN.t for example usage.
-
-At some point a more complicated feature object may be used to support
-this data rather than forcing most of the information into tag/value
-pairs in a SeqFeature::Generic.  This will hopefully allow for more
-flexible analysis of data (specifically RNA secondary structural
-data).
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to
-the Bioperl mailing list.  Your participation is much appreciated.
-
-  bioperl-l at bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l at bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-of the bugs and their resolution. Bug reports can be submitted via the
-web:
-
-  https://github.com/bioperl/bioperl-live/issues
-
-=head1 AUTHOR - Chris Fields
-
-Email cjfields-at-uiuc-dot-edu
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
-=cut
-
-# Let the code begin...
-
-package Bio::Tools::ERPIN;
-use strict;
-
-use Bio::SeqFeature::Generic;
-
-use base qw(Bio::Tools::AnalysisResult);
-
-our($MotifTag,$SrcTag,$DescTag) = qw(misc_binding ERPIN erpin);
-
-=head2 new
-
- Title   : new
- Usage   : my $obj = Bio::Tools::ERPIN->new();
- Function: Builds a new Bio::Tools::ERPIN object 
- Returns : an instance of Bio::Tools::ERPIN
- Args    : -fh/-file for input filename
-           -motiftag => primary tag used in gene features (default 'misc_binding')
-           -desctag => tag used for display_name name (default 'erpin')
-           -srctag  => source tag used in all features (default 'ERPIN')
-
-=cut
-
-sub _initialize {
-    my($self, at args) = @_;
-    $self->warn('Use of this module is deprecated.  Use Bio::SearchIO::erpin instead');    
-    $self->SUPER::_initialize(@args);
-    my ($motiftag,$desctag,$srctag) =  $self->SUPER::_rearrange([qw(MOTIFTAG
-                                                                    DESCTAG
-                                                                    SRCTAG
-                                   )],
-                                    @args);
-    $self->motif_tag(defined $motiftag ? $motiftag : $MotifTag);
-    $self->source_tag(defined $srctag ? $srctag : $SrcTag);
-    $self->desc_tag(defined $desctag ? $desctag : $DescTag);
-    foreach (qw(_tset _tset_desc _cutoff _db _db_desc
-               _db_ratios _eval_cutoff _seqid _secacc _seqdesc )) {
-        $self->{$_}='';
-    }
-}
-
-=head2 motif_tag
-
- Title   : motiftag
- Usage   : $obj->motiftag($newval)
- Function: Get/Set the value used for 'motif_tag', which is used for setting the
-           primary_tag.
-           Default is 'misc_binding' as set by the global $MotifTag.
-           'misc_binding' is used here because a conserved RNA motif is capable
-           of binding proteins (regulatory proteins), antisense RNA (siRNA),
-           small molecules (riboswitches), or nothing at all (tRNA,
-           terminators, etc.).  It is recommended that this be changed to other
-           tags ('misc_RNA', 'protein_binding', 'tRNA', etc.) where appropriate.
-           For more information, see:
-           http://www.ncbi.nlm.nih.gov/collab/FT/index.html
- Returns : value of motif_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub motif_tag{
-    my $self = shift;
-
-    return $self->{'motif_tag'} = shift if @_;
-    return $self->{'motif_tag'};
-}
-
-=head2 source_tag
-
- Title   : source_tag
- Usage   : $obj->source_tag($newval)
- Function: Get/Set the value used for the 'source_tag'.
-           Default is 'ERPIN' as set by the global $SrcTag
- Returns : value of source_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-
-=cut
-
-sub source_tag{
-    my $self = shift;
-
-    return $self->{'source_tag'} = shift if @_;
-    return $self->{'source_tag'};
-}
-
-=head2 desc_tag
-
- Title   : desc_tag
- Usage   : $obj->desc_tag($newval)
- Function: Get/Set the value used for the query motif.  This will be placed in
-           the tag '-display_name'.  Default is 'erpin' as set by the global
-           $DescTag.  Use this to manually set the descriptor (motif searched for).
-           Since there is no way for this module to tell what the motif is from the
-           name of the descriptor file or the ERPIN output, this should
-           be set every time an ERPIN object is instantiated for clarity
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub desc_tag{
-    my $self = shift;
-
-    return $self->{'desc_tag'} = shift if @_;
-    return $self->{'desc_tag'};
-}
-
-=head2 analysis_method
-
- Usage     : $obj->analysis_method();
- Purpose   : Inherited method. Overridden to ensure that the name matches
-             /ERPIN/i.
- Returns   : String
- Argument  : n/a
-
-=cut
-
-#-------------
-sub analysis_method { 
-#-------------
-    my ($self, $method) = @_;  
-    if($method && ($method !~ /ERPIN/i)) {
-    $self->throw("method $method not supported in " . ref($self));
-    }
-    return $self->SUPER::analysis_method($method);
-}
-
-=head2 next_feature
-
- Title   : next_feature
- Usage   : while($gene = $obj->next_feature()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the ERPIN result
-           file. Call this method repeatedly until FALSE is returned.
-           The returned object is actually a SeqFeatureI implementing object.
-           This method is required for classes implementing the
-           SeqAnalysisParserI interface, and is merely an alias for 
-           next_prediction() at present.
- Returns : A Bio::Tools::Prediction::Gene object.
- Args    : None (at present)
-
-=cut
-
-sub next_feature {
-    my ($self, at args) = @_;
-    # even though next_prediction doesn't expect any args (and this method
-    # does neither), we pass on args in order to be prepared if this changes
-    # ever
-    return $self->next_prediction(@args);
-}
-
-=head2 next_prediction
-
- Title   : next_prediction
- Usage   : while($gene = $obj->next_prediction()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the ERPIN result
-           file. Call this method repeatedly until FALSE is returned.
- Returns : A Bio::Tools::Prediction::Gene object.
- Args    : None (at present)
-
-=cut
-
-sub next_prediction {
-    my ($self) = @_;
-    my ($motiftag,$srctag,$desctag) = ( $self->motif_tag,
-                       $self->source_tag,
-                       $self->desc_tag);
-    # hit vars
-    my ($strand, $start, $end, $sequence, $logodds, $score)=0;
-    while($_ = $self->_readline) {
-        #skip blank lines
-        next if /^\s+$/;
-        # parse header; there's probably a better way to do this, perhaps by
-        # mapping, but this works for now...
-        if(/^Training set:\s+\"(.*)\":$/) {
-            $self->{'_tset'}=$1;
-        }
-        elsif(/\s+(\d+ sequences of length \d+)/){
-            $self->{'_tset_descr'}=$1;
-        }
-        elsif(/^Cutoff:\s+(\S+)\s+$/) {
-            $self->{'_cutoff'}=$1;
-        }
-        elsif(/^Database:\s+\"(.*)\"$/) {
-            $self->{'_db'}=$1;
-        }
-        elsif(/^\s+(\d+ nucleotides to be processed in \d+ sequence)$/) {
-            $self->{'_db_desc'}=$1;
-        }
-        elsif(/^\s+ATGC ratios:\s(\d.\d+)\s+(\d.\d+)\s+(\d.\d+)\s+(\d.\d+)$/) {
-            my $atgc=sprintf("A=%0.3f T=%0.3f G=%0.3f C=%0.3f", $1, $2, $3, $4);
-            $self->{'_db_ratios'}=$atgc;
-        }
-        elsif(/^E-value at cutoff \S+ for \S+(?:G|M|k)?b double strand data: (\S+)/) {
-            $self->{'_eval_cutoff'}=$1;
-        }
-        # catch hit, store in private hash keys
-        elsif (/^>(.*)/) {
-            $self->{_seq_desc} = $1;
-            if($self->{_seq_desc} =~
-               /(?:P<db>gb|gi|emb|dbj|sp|pdb|bbs|ref|lcl)\|(\d+)((?:\:|\|)\w+\|(\S*.\d+)\|)?/) { 
-                $self->{_seqid} = $1; # pulls out gid
-                $self->{_seq_acc} = $3;
-            } else {
-                $self->{_seqid} = $self->{_seq_desc};
-                $self->{_seq_acc} = '';
-            }
-        }
-        # parse next hit
-        elsif (/^(FW|RC)\s+\d+\s+(\d+)..(\d+)\s+(\d+.\d+)\s+(.*)/) {
-            ($strand, $start, $end, $logodds, $score)=($1, $2, $3, $4, $5);
-            $score =~ s/^e/1e/i;
-            chomp ($sequence = $self->_readline); # grab next line, which is the sequence hit
-            my $gene = Bio::SeqFeature::Generic->new(-seq_id => $self->{_seqid},
-                                                      -start  => $start,
-                                                      -end    => $end,
-                                                      -strand => $strand eq 'FW' ? 1 : -1,
-                                                      -score  => $score,
-                                                      -primary_tag => $motiftag,
-                                                      -source_tag  => $srctag,
-                                                      -display_name => $desctag,
-                                                      -tag     => {
-                                                        'tset'          => $self->{_tset},
-                                                        'tsetdesc'      => $self->{_tset_descr},
-                                                        'cutoff'        => $self->{_cutoff},
-                                                        'database'      => $self->{_db},
-                                                        'dbdesc'        => $self->{_db_desc},
-                                                        'dbratios'      => $self->{_db_ratios},
-                                                        'descline'      => $self->{_seq_desc},
-                                                        'accession'     => $self->{_seq_acc},
-                                                        'logodds'       => $logodds,
-                                                        'sequence'      => $sequence}
-                                                    );
-            return $gene;
-        }
-        #else {
-        #    $self->debug("unrecognized line: $_");
-        #}
-    }
-}
-
-1;
\ No newline at end of file
diff --git a/Bio/Tools/Infernal.pm b/Bio/Tools/Infernal.pm
deleted file mode 100644
index 4973fab..0000000
--- a/Bio/Tools/Infernal.pm
+++ /dev/null
@@ -1,492 +0,0 @@
-#
-# BioPerl module for Bio::Tools::Infernal
-#
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
-#
-# Cared for by Chris Fields <cjfields-at-uiuc-dot-edu>
-#
-# Copyright Chris Fields
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
-
-Bio::Tools::Infernal - A parser for Infernal output
-
-=head1 SYNOPSIS
-
-  use Bio::Tools::Infernal;
-  my $parser = Bio::Tools::Infernal->new(-file => $rna_output,
-                                        -motiftag => 'misc_binding'
-                                        -desctag => 'Lysine riboswitch',
-                                        -cm    => 'RF00168',
-                                        -rfam  =>  'RF00168',
-                                        -minscore => 20);
-  #parse the results, get a Bio::SeqFeature::FeaturePair
-  while( my $motif = $parser->next_prediction) {
-    # do something here
-  }
-
-=head1 DESCRIPTION
-
-This is a highly experimental parser for Infernal output from the cmsearch
-program.  At some point it is anticipated that this will morph into a proper
-SearchIO parser, along with the related RNAMotif and ERPIN tools.
-
-The Infernal suite of programs are used for generating RNA CM (covariance
-models) and searching sequences using CMs to locate potentially similar
-structures.  The program is under active development; it is anticiapted that
-this will support the latest version available.
-
-This parser has been tested and is capable of parsing Infernal 0.7 and 0.71
-output.  However, future Infernal versions may break parsing as the output is
-constantly evolving, so keep an eye on this space for additional notes.
-
-Currently data is parsed into a Bio::SeqFeature::FeaturePair object, consisting
-of a query (the covariance model) and the hit (sequence searched).  
-
-Model data is accessible via the following:
-
-  Data            SeqFeature::FeaturePair         Note
-  --------------------------------------------------------------------------
-  primary tag     $sf->primary_tag                Rfam ID (if passed to new())
-  start           $sf->start                      Based on CM length
-  end             $sf->end                        Based on CM length
-  score           $sf->score                      Bit score
-  strand          $sf->strand                     0 (CM does not have a strand)
-  seqid           $sf->seq_id                     Rfam ID (if passed to new())
-  display name    $sf->feature1->display_name     CM name (if passed to new())
-  source          $sf->feature1->source tag      'Infernal' followed by version
-
-Hit data is accessible via the following:
-
-  Data            SeqFeature::FeaturePair         Note
-  ------------------------------------------------------------------
-  start           $sf->hstart
-  end             $sf->hend
-  score(bits)     $sf->hscore
-  strand          $sf->hstrand
-  seqid           $sf->hseqid
-  Primary Tag     $sf->hprimary_tag
-  Source Tag      $sf->hsource_tag
-
-Added FeaturePair tags are : 
-
-   secstructure - entire description line (in case the regex used for
-                  sequence ID doesn't adequately catch the name
-   model        - name of the descriptor file (may include path to file)
-   midline      - contains structural information from the descriptor
-                  used as a query
-   hit          - sequence of motif, separated by spaces according to
-                  matches to the structure in the descriptor (in
-                  SecStructure).
-   seqname      - raw sequence name (for downstream parsing if needed)
-
-An additional parameter ('minscore') is added due to the huge number
-of spurious hits generated by cmsearch.  This screens data, only building
-and returning objects when a minimal bitscore is present.  
-
-See t/rnamotif.t for example usage.
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to
-the Bioperl mailing list.  Your participation is much appreciated.
-
-  bioperl-l at bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l at bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-of the bugs and their resolution. Bug reports can be submitted via the
-web:
-
-  https://github.com/bioperl/bioperl-live/issues
-
-=head1 AUTHOR - Chris Fields
-
-Email cjfields-at-uiuc-dot-edu
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
-=cut
-
-# Let the code begin...
-
-package Bio::Tools::Infernal;
-use strict;
-
-use Bio::SeqFeature::Generic;
-use Bio::SeqFeature::FeaturePair;
-use Data::Dumper;
-use base qw(Bio::Tools::AnalysisResult);
-
-our($MotifTag,$SrcTag,$DescTag) = qw(misc_binding Infernal infernal);
-
-our $MINSCORE = 0;
-our $DEFAULT_VERSION = '0.71';
-
-=head2 new
-
- Title   : new
- Usage   : my $obj = Bio::Tools::Infernal->new();
- Function: Builds a new Bio::Tools::Infernal object 
- Returns : an instance of Bio::Tools::Infernal
- Args    : -fh/-file  - for input filehandle/filename
-           -motiftag  - primary tag used in gene features (default 'misc_binding')
-           -desctag   - tag used for display_name name (default 'infernal')
-           -srctag    - source tag used in all features (default 'Infernal')
-           -rfam      - Rfam id number
-           -cm        - covariance model used in analysis (may be same as rfam #)
-           -minscore  - minimum score (simple screener, since Infernal generates
-                        a ton of spurious hits)
-           -version   - Infernal program version
-
-=cut
-
-# yes, this is actually _initialize, but the args are passed to
-# the constructor.
-# see Bio::Tools::AnalysisResult for further details
-
-sub _initialize {
-  my($self, at args) = @_;
-  $self->warn('Use of this module is deprecated.  Use Bio::SearchIO::infernal instead');  
-  $self->SUPER::_initialize(@args);
-  my ($motiftag,$desctag,$srctag,$rfam,$cm,$ms,$ver) =
-        $self->SUPER::_rearrange([qw(MOTIFTAG
-                                    DESCTAG
-                                    SRCTAG
-                                    RFAM
-                                    CM
-                                    MINSCORE
-                                    VERSION
-                                 )], at args);
-  $self->motif_tag(defined $motiftag ? $motiftag : $MotifTag);
-  $self->source_tag(defined $srctag ? $srctag : $SrcTag);
-  $self->desc_tag(defined $desctag ? $desctag : $DescTag);
-  $cm        && $self->covariance_model($cm);
-  $rfam      && $self->rfam($rfam);
-  $self->program_version(defined $ver ? $ver : $DEFAULT_VERSION);
-  $self->minscore(defined $ms ? $ms : $MINSCORE);
-}
-
-=head2 motif_tag
-
- Title   : motif_tag
- Usage   : $obj->motif_tag($newval)
- Function: Get/Set the value used for 'motif_tag', which is used for setting the
-           primary_tag.
-           Default is 'misc_binding' as set by the global $MotifTag.
-           'misc_binding' is used here because a conserved RNA motif is capable
-           of binding proteins (regulatory proteins), antisense RNA (siRNA),
-           small molecules (riboswitches), or nothing at all (tRNA,
-           terminators, etc.).  It is recommended that this be changed to other
-           tags ('misc_RNA', 'protein_binding', 'tRNA', etc.) where appropriate.
-           For more information, see:
-           http://www.ncbi.nlm.nih.gov/collab/FT/index.html
- Returns : value of motif_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub motif_tag{
-    my $self = shift;
-
-    return $self->{'motif_tag'} = shift if @_;
-    return $self->{'motif_tag'};
-}
-
-=head2 source_tag
-
- Title   : source_tag
- Usage   : $obj->source_tag($newval)
- Function: Get/Set the value used for the 'source_tag'.
-           Default is 'Infernal' as set by the global $SrcTag
- Returns : value of source_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-
-=cut
-
-sub source_tag{
-    my $self = shift;
-
-    return $self->{'source_tag'} = shift if @_;
-    return $self->{'source_tag'};
-}
-
-=head2 desc_tag
-
- Title   : desc_tag
- Usage   : $obj->desc_tag($newval)
- Function: Get/Set the value used for the query motif.  This will be placed in
-           the tag '-display_name'.  Default is 'infernal' as set by the global
-           $DescTag.  Use this to manually set the descriptor (motif searched for).
-           Since there is no way for this module to tell what the motif is from the
-           name of the descriptor file or the Infernal output, this should
-           be set every time an Infernal object is instantiated for clarity
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub desc_tag{
-    my $self = shift;
-
-    return $self->{'desc_tag'} = shift if @_;
-    return $self->{'desc_tag'};
-}
-
-=head2 covariance_model
-
- Title   : covariance_model
- Usage   : $obj->covariance_model($newval)
- Function: Get/Set the value used for the covariance model used in the analysis.
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub covariance_model{
-    my $self = shift;
-
-    return $self->{'_cmodel'} = shift if @_;
-    return $self->{'_cmodel'};
-}
-
-=head2 rfam
-
- Title   : rfam
- Usage   : $obj->rfam($newval)
- Function: Get/Set the Rfam accession number
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub rfam {
-    my $self = shift;
-
-    return $self->{'_rfam'} = shift if @_;
-    return $self->{'_rfam'};
-}
-
-=head2 minscore
-
- Title   : minscore
- Usage   : $obj->minscore($newval)
- Function: Get/Set the minimum score threshold for generating SeqFeatures
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub minscore {
-    my $self = shift;
-
-    return $self->{'_minscore'} = shift if @_;
-    return $self->{'_minscore'};
-}
-
-=head2 program_version
-
- Title   : program_version
- Usage   : $obj->program_version($newval)
- Function: Get/Set the Infernal program version
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-           Note: this is set to $DEFAULT_VERSION by, um, default
-
-=cut
-
-sub program_version {
-    my $self = shift;
-
-    return $self->{'_program_version'} = shift if @_;
-    return $self->{'_program_version'};
-}
-
-=head2 analysis_method
-
- Usage     : $obj->analysis_method();
- Purpose   : Inherited method. Overridden to ensure that the name matches
-             /Infernal/i.
- Returns   : String
- Argument  : n/a
-
-=cut
-
-sub analysis_method { 
-    my ($self, $method) = @_;  
-    if($method && ($method !~ /Infernal/i)) {
-    $self->throw("method $method not supported in " . ref($self));
-    }
-    return $self->SUPER::analysis_method($method);
-}
-
-=head2 next_feature
-
- Title   : next_feature
- Usage   : while($gene = $obj->next_feature()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the RNAMotif result
-           file. Call this method repeatedly until FALSE is returned.
-           The returned object is actually a SeqFeatureI implementing object.
-           This method is required for classes implementing the
-           SeqAnalysisParserI interface, and is merely an alias for 
-           next_prediction() at present.
- Returns : A Bio::Tools::Prediction::Gene object.
- Args    : None (at present)
-
-=cut
-
-sub next_feature {
-    my ($self, at args) = @_;
-    # even though next_prediction doesn't expect any args (and this method
-    # does neither), we pass on args in order to be prepared if this changes
-    # ever
-    return $self->next_prediction(@args);
-}
-
-=head2 next_prediction
-
- Title   : next_prediction
- Usage   : while($gene = $obj->next_prediction()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the RNAMotif result
-           file. Call this method repeatedly until FALSE is returned.
- Returns : A Bio::SeqFeature::Generic object
- Args    : None (at present)
-
-=cut
-
-sub next_prediction {
-    my ($self) = @_;
-    
-    my ($start, $end, $strand, $score);
-    
-    my %hsp_key = ('0' => 'structure',
-                   '1' => 'model',
-                   '2' => 'midline',
-                   '3' => 'hit');
-    my $line;
-    PARSER:
-    while($line = $self->_readline) {
-        next if $line =~ m{^\s+$};
-        if ($line =~ m{^sequence:\s+(\S+)} ){
-            $self->_current_hit($1);
-            next PARSER;
-        } elsif ($line =~ m{^hit\s+\d+\s+:\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+bits}xms) {
-            $strand = 1;
-            ($start, $end, $score) = ($1, $2, $3);
-            if ($start > $end) {
-                ($start, $end) = ($end, $start);
-                $strand = -1;
-            }
-            #$self->debug(sprintf("Hit: %-30s\n\tStrand:%-4d Start:%-6d End:%-6d Score:%-10s\n",
-            #       $self->_current_hit, $strand, $start, $end, $score));
-        } elsif ($line =~ m{^(\s+)[<>\{\}\(\)\[\]:_,-\.]+}xms) { # start of HSP
-            $self->_pushback($line); # set up for loop
-            # what is length of the gap to the structure data?
-            my $offset = length($1);
-            my ($ct, $strln) = 0;
-            my $hsp;
-            HSP:
-            while ($line = $self->_readline) {
-                next if $line =~ m{^\s*$}; # toss empty lines
-                chomp $line;
-                # exit loop if at end of file or upon next hit/HSP
-                if (!defined($line) || $line =~ m{^(sequence|hit)}) {
-                    $self->_pushback($line);
-                    last HSP;
-                }
-                # iterate to keep track of each line (4 lines per hsp block)
-                my $iterator = $ct%4;
-                # strlen set only with structure lines (proper length)
-                $strln = length($line) if $iterator == 0;
-                # only grab the data needed (hit start and stop in hit line above;
-                # query start, end are from the actual query length (entire hit is
-                # mapped to CM data, so all CM data is represented
-                
-                # yes this is kinda clumsy, but I'll probably morph this into
-                # a proper SearchIO module soon.  For now this works...
-                my $data = substr($line, $offset, $strln-$offset);
-                $hsp->{ $hsp_key{$iterator} } .= $data;
-                $ct++;
-            }
-            if ($self->minscore < $score) {
-                my ($name, $program, $rfam, $cm, $dt, $st, $mt) =
-                  ($self->_current_hit, $self->analysis_method, $self->rfam,
-                   $self->covariance_model, $self->desc_tag, $self->source_tag,
-                   $self->motif_tag);
-                my $ver = $self->program_version || '';
-                my $qid = $name;
-                if ($name =~ m{(?:gb|gi|emb|dbj|sp|pdb|bbs|ref|lcl)\|(\d+)((?:\:|\|)\w+\|(\S*.\d+)\|)?}xms) {
-                    $qid = $1; 
-                }
-                my $fp = Bio::SeqFeature::FeaturePair->new();
-                my $strlen = $hsp->{'model'} =~ tr{A-Za-z}{A-Za-z}; # gaps don't count
-                my $qf = Bio::SeqFeature::Generic->new( -primary_tag => $mt,
-                              -source_tag  => "$st $ver",
-                              -display_name => $cm || '',
-                              -score       => $score,
-                              -start       => 1,
-                              -end         => $strlen,
-                              -seq_id      => $rfam || '',
-                              -strand      => 0, # covariance model does not have a strand
-                            );
-                my $hf = Bio::SeqFeature::Generic->new( -primary_tag => $mt,
-                              -source_tag  => "$st $ver",
-                              -display_name => $dt || '',
-                              -score       => $score,
-                              -start       => $start,
-                              -end         => $end,
-                              -seq_id      => $qid,
-                              -strand      => $strand
-                            );
-                $fp->feature1($qf);
-                $fp->feature2($hf); # should emphasis be on the hit?
-                $fp->add_tag_value('secstructure', $hsp->{'structure'});
-                $fp->add_tag_value('model', $hsp->{'model'});
-                $fp->add_tag_value('midline', $hsp->{'midline'});
-                $fp->add_tag_value('hit', $hsp->{'hit'});
-                $fp->add_tag_value('seq_name', $name);
-                $fp->display_name($dt);
-                return $fp;
-            } else {
-                next PARSER;
-            }
-        }
-    }
-    return (defined($line)) ? 1 : 0;
-}
-
-sub _current_hit {
-    my $self = shift;
-    return $self->{'_currhit'} = shift if @_;
-    return $self->{'_currhit'};
-}
-
-1;
diff --git a/Bio/Tools/RNAMotif.pm b/Bio/Tools/RNAMotif.pm
deleted file mode 100644
index 4df7406..0000000
--- a/Bio/Tools/RNAMotif.pm
+++ /dev/null
@@ -1,427 +0,0 @@
-#
-# BioPerl module for Bio::Tools::RNAMotif
-#
-# Please direct questions and support issues to <bioperl-l at bioperl.org> 
-#
-# Cared for by Chris Fields <cjfields-at-uiuc-dot-edu>
-#
-# Copyright Chris Fields
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
-
-Bio::Tools::RNAMotif - A parser for RNAMotif output
-
-=head1 SYNOPSIS
-
-  use Bio::Tools::RNAMotif;
-  my $parser = Bio::Tools::RNAMotif->new(-file => $rna_output,
-                                        -motiftag => 'protein_bind'
-                                        -desctag => 'TRAP_binding');
-  #parse the results
-  while( my $motif = $parser->next_prediction) {
-    # do something here
-  }
-
-=head1 DESCRIPTION
-
-Parses raw RNAMotif output.  RNAMotif uses a RNA profile, consisting
-of sequence and structural elements stored in a descriptor file, to
-search for potential motifs in a DNA sequence file.  For more
-information, see:
-
-Macke TJ, Ecker DJ, Gutell RR, Gautheret D, Case DA, Sampath R. 
-RNAMotif, an RNA secondary structure definition and search algorithm.
-Nucleic Acids Res. 2001 Nov 15;29(22):4724-35. 
-http://www.scripps.edu/mb/case/casegr-sh-3.5.html.
-
-This module is not currently complete.  As is, it will parse raw
-RNAMotif output (i.e. information not passed through the secondary
-programs rmfmt or rm2ct) and pack information into
-Bio::SeqFeature::Generic objects.  Currently, parsing extra output
-utilized by the sprintf() function in an RNAMotif descriptor is not
-implemented; this information is instead packed into the score tag,
-which can be accessed by using the following:
-
-  my ($score) = $feature->score; 
-
-If the score contains anything besides a digit, it will throw a
-warning that sprintf() may have been used.
-Several values have also been added in the 'tag' hash.  These can be
-accessed using the following syntax:
-
-  my ($entry) = $feature->get_Annotations('secstructure');
-
-Added tags are : 
-
-   descline     - entire description line (in case the regex used for
-                  sequence ID doesn't adequately catch the name
-   descfile     - name of the descriptor file (may include path to file)
-   secstrucure  - contains structural information from the descriptor
-                  used as a query
-   sequence     - sequence of motif, separated by spaces according to
-                  matches to the structure in the descriptor (in
-                  SecStructure).
-
-See t/RNAMotif.t for example usage.
-
-The clean_features method can also be used to return a list of seqfeatures (in a
-Bio::SeqFeature::Collection object) that are within a particular region.   RNAMotif
-is prone with some descriptors to returning redundant hits; an attempt to rectify
-this problem is attempted with RNAMotif's companion program rmprune, which returns
-the structure with the longest helices (and theoretically the best scoring structure).
-However, this doesn't take into account alternative foldings which may score better.
-This method adds a bit more flexibility, giving the user the ability to screen folds
-based on where the feature is found and the score.  Passing a positive integer x
-screens SeqFeatures based on the highest score within x bp, while a negative integer
-screens based on the lowest score. So, to return the highest scoring values within
-20 bp (likely using an arbitrary scroing system in the SCORE section of a descriptor
-file), one could use:
-
-  $list = $obj->clean_features(20); 
-
-... and returning the lowest scoring structures within the same region (when the
-score is based on calculated free energies from efn2) can be accomplished
-by the following:
-
-  $list = $obj->clean_features(-20);
-
-If you wanted the best feature in a sequence, you could set this to a large number,
-preferrably on that exceeds the bases in a sequence
-
-  $list = $obj->clean_features(10000000);
-
-Each seqfeature in the collection can then be acted upon:
-
-  @sf = $list->get_all_features;
-  for my $f (@sf) {
-    # do crazy things here
-  }
-
-At some point a more complicated feature object may be used to support
-this data rather than forcing most of the information into tag/value
-pairs in a SeqFeature::Generic.  This will hopefully allow for more
-flexible analysis of data (specifically RNA secondary structural
-data).  It works for now...
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to
-the Bioperl mailing list.  Your participation is much appreciated.
-
-  bioperl-l at bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l at bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-of the bugs and their resolution. Bug reports can be submitted via the
-web:
-
-  https://github.com/bioperl/bioperl-live/issues
-
-=head1 AUTHOR - Chris Fields
-
-Email cjfields-at-uiuc-dot-edu
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
-=cut
-
-# Let the code begin...
-
-package Bio::Tools::RNAMotif;
-use strict;
-
-use Bio::SeqFeature::Generic;
-use Bio::SeqFeature::Collection;
-
-use base qw(Bio::Tools::AnalysisResult);
-
-our($MotifTag,$SrcTag,$DescTag) = qw(misc_binding RNAMotif rnamotif);
-
-=head2 new
-
- Title   : new
- Usage   : my $obj = Bio::Tools::RNAMotif->new();
- Function: Builds a new Bio::Tools::RNAMotif object 
- Returns : an instance of Bio::Tools::RNAMotif
- Args    : -fh/-file for input filename
-           -motiftag => primary tag used in gene features (default 'misc_binding')
-           -desctag => tag used for display_name name (default 'rnamotif')
-           -srctag  => source tag used in all features (default 'RNAMotif')
-
-=cut
-
-sub _initialize {
-  my($self, at args) = @_;
-  $self->warn('Use of this module is deprecated.  Use Bio::SearchIO::rnamotif instead');
-  $self->SUPER::_initialize(@args);
-  my ($motiftag,$desctag,$srctag) =  $self->SUPER::_rearrange([qw(MOTIFTAG
-                                                                  DESCTAG
-                                                                  SRCTAG
-                                 )],
-                                  @args);
-  $self->motif_tag(defined $motiftag ? $motiftag : $MotifTag);
-  $self->source_tag(defined $srctag ? $srctag : $SrcTag);
-  $self->desc_tag(defined $desctag ? $desctag : $DescTag);
-  $self->{'_sec_structure' => '',
-          '_dfile' => ''};
-}
-
-=head2 motif_tag
-
- Title   : motif_tag
- Usage   : $obj->motif_tag($newval)
- Function: Get/Set the value used for 'motif_tag', which is used for setting the
-           primary_tag.
-           Default is 'misc_binding' as set by the global $MotifTag.
-           'misc_binding' is used here because a conserved RNA motif is capable
-           of binding proteins (regulatory proteins), antisense RNA (siRNA),
-           small molecules (riboswitches), or nothing at all (tRNA,
-           terminators, etc.).  It is recommended that this be changed to other
-           tags ('misc_RNA', 'protein_binding', 'tRNA', etc.) where appropriate.
-           For more information, see:
-           http://www.ncbi.nlm.nih.gov/collab/FT/index.html
- Returns : value of motif_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub motif_tag{
-    my $self = shift;
-
-    return $self->{'motif_tag'} = shift if @_;
-    return $self->{'motif_tag'};
-}
-
-=head2 source_tag
-
- Title   : source_tag
- Usage   : $obj->source_tag($newval)
- Function: Get/Set the value used for the 'source_tag'.
-           Default is 'RNAMotif' as set by the global $SrcTag
- Returns : value of source_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-
-=cut
-
-sub source_tag{
-    my $self = shift;
-
-    return $self->{'source_tag'} = shift if @_;
-    return $self->{'source_tag'};
-}
-
-
-=head2 desc_tag
-
- Title   : desc_tag
- Usage   : $obj->desc_tag($newval)
- Function: Get/Set the value used for the query motif.  This will be placed in
-           the tag '-display_name'.  Default is 'rnamotif' as set by the global
-           $DescTag.  Use this to manually set the descriptor (motif searched for).
-           Since there is no way for this module to tell what the motif is from the
-           name of the descriptor file or the RNAMotif output, this should
-           be set every time an RNAMotif object is instantiated for clarity
- Returns : value of exon_tag (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
-=cut
-
-sub desc_tag{
-    my $self = shift;
-
-    return $self->{'desc_tag'} = shift if @_;
-    return $self->{'desc_tag'};
-}
-
-=head2 analysis_method
-
- Usage     : $obj->analysis_method();
- Purpose   : Inherited method. Overridden to ensure that the name matches
-             /RNAMotif/i.
- Returns   : String
- Argument  : n/a
-
-=cut
-
-#-------------
-sub analysis_method { 
-#-------------
-    my ($self, $method) = @_;  
-    if($method && ($method !~ /RNAMotif/i)) {
-    $self->throw("method $method not supported in " . ref($self));
-    }
-    return $self->SUPER::analysis_method($method);
-}
-
-=head2 next_feature
-
- Title   : next_feature
- Usage   : while($gene = $obj->next_feature()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the RNAMotif result
-           file. Call this method repeatedly until FALSE is returned.
-           The returned object is actually a SeqFeatureI implementing object.
-           This method is required for classes implementing the
-           SeqAnalysisParserI interface, and is merely an alias for 
-           next_prediction() at present.
- Returns : A Bio::Tools::Prediction::Gene object.
- Args    : None (at present)
-
-=cut
-
-sub next_feature {
-    my ($self, at args) = @_;
-    # even though next_prediction doesn't expect any args (and this method
-    # does neither), we pass on args in order to be prepared if this changes
-    # ever
-    return $self->next_prediction(@args);
-}
-
-=head2 next_prediction
-
- Title   : next_prediction
- Usage   : while($gene = $obj->next_prediction()) {
-                  # do something
-           }
- Function: Returns the next gene structure prediction of the RNAMotif result
-           file. Call this method repeatedly until FALSE is returned.
- Returns : A Bio::SeqFeature::Generic object
- Args    : None (at present)
-
-=cut
-
-sub next_prediction {
-    my ($self) = @_;
-    my ($motiftag,$srctag,$desctag) = ( $self->motif_tag,
-                       $self->source_tag,
-                       $self->desc_tag);
-    my ($score, $strand, $start, $length, $sequence, $end, $seqid, $description)=0;
-    while($_ = $self->_readline) {
-        while($_ =~ /^#RM/) { # header line
-            if(/^#RM\sdescr\s(.*)$/) { # contains sec structure
-                $self->{'_sec_structure'}=$1;
-            }
-            if(/^#RM\sdfile\s(.*)$/) { # contains dfile
-                $self->{'_dfile'}=$1;
-            }
-            $_ = $self->_readline;
-        }
-        if(m/^>((\S*)\s.*)$/) {
-            $seqid = $2;
-            $description = $1; # contains entire description line if needed
-            if($seqid =~  /(gb|emb|dbj|sp|pdb|bbs|ref|lcl)\|(.*)\|/) {
-                $seqid = $2; # pulls out gid
-            }
-        }
-        # start pulling out hit information...
-        # regex is m/^\S+\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s(.*)$/
-        # m/^\S+\s+     # seqID, not needed
-        # (.+)\s+       # score, or extra info using sprintf()
-        # (\d+)\s+      # strand
-        # (\d+)\s+      # start
-        # (\d+)\s       # length
-        # (.*)$/        # sequence, divided according to descriptor
-        if(m/^\S+\s+(.+)\s+(\d+)\s+(\d+)\s+(\d+)\s(.*)$/) {
-            ($score, $strand, $start, $length, $sequence, $end)=
-                ($1, $2, $3, $4, $5, 0);
-            if( $strand==0 ) {
-                $end = $start + $length -1;
-                $strand = 1;
-            } else {
-                $end = $start - $length + 1;
-                ($start, $end, $strand) = ($end, $start, -1);
-            }
-            my $gene = Bio::SeqFeature::Generic->new(-seq_id => $seqid,
-                                                      -start  => $start,
-                                                      -end    => $end,
-                                                      -strand => $strand,
-                                                      -score  => $score,
-                                                      -primary_tag => $motiftag,
-                                                      -source_tag  => $srctag,
-                                                      -display_name => $desctag,
-                                                      -tag     => {
-                                                        'descline'       => $description,
-                                                        'descfile'      => $self->{'_dfile'},
-                                                        'secstructure'  => $self->{'_sec_structure'},
-                                                        'sequence'       => $sequence});
-            return $gene;
-        }
-    }
-}
-
-=head2 clean_features
-
- Title   : next_prediction
- Usage   : @list = $obj->clean_features(-10);
- Function: Cleans (reduces redundant hits) based on score, position
- Returns : a Bio::SeqFeature::Collection object
- Args    : Pos./Neg. integer (for highest/lowest scoring seqfeature within x bp).
- Throws  : Error unless digit is entered.  
-
-=cut
-
-sub clean_features {
-    my $self = shift;
-    my $bp = shift;
-    $self->throw("No arg, need pos. or neg. integer") if !$bp;
-    $self->throw("Need pos. or neg. integer") if ($bp !~ /\-?\d/ || $bp =~ /\./);
-    my ($b, $sf2);
-    my @list = ();
-    my @features = ();
-    while (my $pred = $self->next_prediction) {
-        push @features, $pred;
-    }
-    while (@features) {
-        $b = shift @features if !defined($b);
-        $sf2 = shift @features;
-        # from same sequence?
-        if ($sf2) { # if there is no feature, then...
-            if ($b->seq_id == $sf2->seq_id) {
-                # close starts (probable redundant hit)?
-                if(abs(($b->start)-($sf2->start)) <= abs($bp)) {
-                    # which score is better?
-                    if( (($bp < 0) && ($b->score > $sf2->score))  ||  # lowest score
-                        (($bp > 0) && ($b->score < $sf2->score)) ){   # highest score
-                        $b = $sf2;
-                        next;
-                    } else {
-                        next;
-                    }
-                }
-                push @list, $b;
-                $b = $sf2;
-            }
-        }
-    }
-    push @list, $b if $b;
-    my $col = Bio::SeqFeature::Collection->new;
-    $col->add_features(\@list);
-    return $col;
-}
-
-1;
diff --git a/Bio/Tools/Run/RemoteBlast.pm b/Bio/Tools/Run/RemoteBlast.pm
index 48984c9..d987958 100644
--- a/Bio/Tools/Run/RemoteBlast.pm
+++ b/Bio/Tools/Run/RemoteBlast.pm
@@ -104,7 +104,7 @@ via HTTP
 Class for remote execution of the NCBI Blast via HTTP.
 
 For a description of the many CGI parameters see:
-http://www.ncbi.nlm.nih.gov/BLAST/Doc/urlapi.html
+https://www.ncbi.nlm.nih.gov/BLAST/Doc/urlapi.html
 
 Various additional options and input formats are available.
 
@@ -179,7 +179,7 @@ use base qw(Bio::Root::IO Exporter);
 
 our @EXPORT = qw( NOT_FINISHED ERR_QBSTATUS ERR_NOCONTENT ERR_HTTPFAIL ERR_QBNONSPEC );
 our $MODVERSION = $Bio::Root::Version::VERSION;
-our $URLBASE = 'http://blast.ncbi.nlm.nih.gov/Blast.cgi';
+our $URLBASE = 'https://blast.ncbi.nlm.nih.gov/Blast.cgi';
 
 # In GET/PUTPARAMS the values are regexes which validate the input.
 our %PUTPARAMS = (
diff --git a/Build.PL b/Build.PL
index af3ce3c..5e2bc27 100644
--- a/Build.PL
+++ b/Build.PL
@@ -71,7 +71,7 @@ my %recommends = (
     ],
 
     'CGI' => [ 0, 'CGI-y things/Bio::DB::Query::HIVQuery' ],
-    
+
     'Clone' => [ 0, 'Cloning objects/Bio::Root::Root,Bio::Tools::Primer3' ],
 
     'Convert::Binary::C' =>
@@ -223,7 +223,7 @@ my $build = Bio::Root::Build->new(
     configure_requires => {
         'Module::Build' => 0.42,
     },
-    
+
     build_requires => {
         'Module::Build' => 0.42,
         'CPAN'          => 1.81,
@@ -337,8 +337,12 @@ if ( $build->args('network') ) {
 # Add additional files here
 $build->add_build_element('xml');
 
+if ( ! -e 'MANIFEST' ) {
+    $build->ACTION_manifest();
+}
+
 # Create the build script and exit
-$build->create_build_script;
+$build->create_build_script();
 
 exit;
 
diff --git a/Changes b/Changes
index 4c4a3d7..81b2e78 100644
--- a/Changes
+++ b/Changes
@@ -17,13 +17,52 @@ Bugs and requested features list:
 CPAN releases are branched from 'master'.
 ---------------------------------------------------------
 
-1.6.925
+Philosophy for 1.7.x:
 
-    * WrapperBase quoted option values [majensen]
-    * Various documentation fixes and updates [bosborne]
+In order to reduce the number of dependencies, we are actively encouraging
+developers wanting to submit new code with additional dependencies to release
+code in a separate repository and release it on CPAN. We can help assist in this
+process and can also place this under the 'bioperl' Github organization (and
+similarly under the bioperl umbrella account in CPAN), though this is not
+required.
+
+We will also be moving additonal code to other repositories and will release
+them separately on CPAN. Modules considered obsolute (relies on a dead web
+service or utilizes strict dependencies that are also considered obsolete) will
+be removed.
+
+1.7.0 - "Disney"
+
+    [New site]
+    
+    * We have migrated to Github Pages. This was actually planned, but the
+      recent OBF server compromise forced our hand.
+      
+      Brian Osborne [bosborne] took this under his wing to move docs and has
+      done a tremendous amount of work formatting the site and working out some
+      of the idiosyncracies with the new Jekyll-based design.  Mark Jensen, Paul
+      Cantalupo and Franscison Ossandon also helped.  Kudos!!
+      
+    * Similarly, the official issue tracker is now Github Issues.  This has
+      been updated in the relevant documentation bits (we hope!) 
+
+    [Code changes]
+    
+    * Previously deprecated modules removed
+      * Bio::Tools::Infernal, Bio::Tools::ERPIN, Bio::Tools::RNAMotif
+    * Bio::DB::SeqHound has been removed due to the service no longer being
+      available
+    * Bio::Tools::Analysis::Protein::Mitoprot has been removed for security
+      reasons due to the server no longer having a valid cert
+    * Bio::EUtilities, Bio::Biblio are now separate releases on CPAN
+    * Bio::Coordinate, Bio::SearchIO::blastxml,
+      Bio::SearchIO::Writer::BSMLResultWriter are now separate releases to be
+      added on CPAN
 
     [New features]
 
+    * Docker instances of tagged releases are available! [hlapp]
+    * NCBI HTTPS support [mjohnson and others]
     * Bio::SearchIO::infernal
       - Issue #131: added CMSEARCH parsing support for Infernal 1.1 [pcantalupo]
     * Bio::Search::HSP::ModelHSP
@@ -31,6 +70,9 @@ CPAN releases are branched from 'master'.
         reports [pcantalupo]
     * Bio::Search::Result::INFERNALResult
       - Added new module to represent features of Infernal reports [pcantalupo]
+    * Bio::DB::Taxonomy SQLite option [cjfields]
+    * WrapperBase quoted option values [majensen]
+    * Various documentation fixes and updates [bosborne]
     
    [Bug Fixes]
    
@@ -38,6 +80,9 @@ CPAN releases are branched from 'master'.
     * Bio::SeqFeature::Generic spliced_seq() bug fix [Eric Snyder, via bosborne]
     * NeXML parser fixes [fjossandon]
     * Bug fix for Bio::DB::SeqFeature memory adapter [lstein]
+    * RT 103272 : SeqFeature database deletion skipped features with a decimal -
+      Joshua Fortriede (Xenbase)
+    * RT 98374: AlignIO issues with sequence names not correctly parsing - Xiaoyu Zhuo
     * Issue #70: CONTIG parsing in GenBank output fixed [fjossandon]
     * Issue #76: Circular genome fixes with Bio::Location::Split [fjossandon]
     * Issue #80: Fix lack of caching issue with Bio::DB::Taxonomy [fjossandon]
@@ -56,6 +101,7 @@ CPAN releases are branched from 'master'.
     * Adjusted FTLocationFactory.pm to comply with current GenBank Feature Table
       Definition, so now "join(complement(C..D),complement(A..B))" is equivalent
       to "complement(join(A..B,C..D))" [fjossandon]
+    * For the many many many fixes that weren't mentioned - blame the release guy!
 
 1.6.924
 
diff --git a/INSTALL-WIN.md b/INSTALL-WIN.md
index bfed373..ebaabba 100644
--- a/INSTALL-WIN.md
+++ b/INSTALL-WIN.md
@@ -1,25 +1,16 @@
- 
-                         Installing Bioperl on Windows
+# Installing BioPerl on Windows
 
-   Contents
-
-     * 1 Introduction
-     * 2 Perl Options
-     * 3 Installing Perl on Windows
-     * 4 CPAN for Strawberry Perl and ActivePerl
-     * 5 Bioperl in Cygwin
-
-1 Introduction
+# Introduction
 
 This installation guide was written by Barry Moore, Nathan Haigh
-and other Bioperl authors based on the original work of Paul Boutros. The
+and other BioPerl authors based on the original work of Paul Boutros. The
 guide has been updated by Paul Cantalupo and Francisco Ossandon.
 *Note* For Windows it is recommended to install BioPerl version 1.6.924 or
 newer, since many Windows-specific bugs from previous versions were fixed.
 
 Please report problems and/or fixes to the BioPerl mailing list.
 
-2 Perl Options
+# Perl Options
 
 There are a couple of ways of installing Perl on a Windows machine. One is
 to get the most recent build from [Strawberry Perl](http://strawberryperl.com/)
@@ -41,7 +32,7 @@ see [ActivePerl MinGW PPM webpage](http://www.activestate.com/activeperl/downloa
 
 *Note* Support for installation through ActivePerl Perl Package Manager has been dropped in favor of CPAN.
 
-3 Installing Perl on Windows
+# Installing Perl on Windows
 
 1. Download the [Strawberry Perl MSI](http://strawberryperl.com/releases.html) or [ActivePerl MSI](http://www.activestate.com/activeperl/downloads).
 2. Run the Installer (accepting all defaults is fine).
@@ -52,7 +43,7 @@ This approach is not recommended unless you have specific reasons for doing so
 and know what you're doing.
 
 [Cygwin](http://en.wikipedia.org/wiki/Cygwin) is a [UNIX](http://en.wikipedia.org/wiki/UNIX)
-emulation environment for Windows and comes with its own copy of Perl. Information on Cygwin and Bioperl is found below.
+emulation environment for Windows and comes with its own copy of Perl. Information on Cygwin and BioPerl is found below.
 
 ### Installation using the ActiveState Perl Package Manager
 
@@ -61,10 +52,10 @@ BioPerl package produced for it was the old version 1.6.1 (2009) and many
 Windows-specific bugs were fixed in more recent versions 1.6.923 and 1.6.924.
 Please install using the CPAN instructions below.
 
-4 CPAN for Strawberry Perl and ActivePerl
+# CPAN for Strawberry Perl and ActivePerl
 
 Both CPAN and manual methods ultimately need the accessory compiling program
-MinGW, which incorporates the necessary tools like dmake and gcc. MinGW comes
+MinGW, which incorporates the necessary tools like `dmake` and `gcc`. MinGW comes
 by default with Strawberry Perl, but must it be installed through PPM for
 ActivePerl (CPAN will display a warning if not present). Also, CPAN need to be
 upgraded to >= v1.81, [Module::Build](https://metacpan.org/pod/Module::Build)
@@ -84,29 +75,29 @@ the release for newest version 5.22 it's still not available (December 2015).
 
 ### Start the install with CPAN
 
-1) Open a cmd window by going to `Start >> Run` and typing `cmd`
+1. Open a cmd window by going to `Start >> Run` and typing `cmd`
 into the box and pressing return.
 
-2) Type `cpan` to enter the CPAN shell.
+2. Type `cpan` to enter the CPAN shell.
 
-3) At the `cpan>` prompt, type `install CPAN` to upgrade to the
+3. At the `cpan>` prompt, type `install CPAN` to upgrade to the
 latest version.
 
-4) Quit (by typing 'q') and reload CPAN. You may be asked some
+4. Quit (by typing 'q') and reload CPAN. You may be asked some
 configuration questions; accepting defaults is fine.
 
-5) At the `cpan>` prompt, type `o conf prefer_installer MB` to tell
+5. At the `cpan>` prompt, type `o conf prefer_installer MB` to tell
 CPAN to prefer to use `Build.PL` scripts for installation, and the type `o conf commit` to save that choice.
 
-6) At the `cpan>` prompt, type `install Module::Build`.
+6. At the `cpan>` prompt, type `install Module::Build`.
 
-7) At the `cpan>` prompt, type `install Test::Harness`.
+7. At the `cpan>` prompt, type `install Test::Harness`.
 
-8) At the `cpan>` prompt, type `install Test::Most`.
+8. At the `cpan>` prompt, type `install Test::Most`.
 
 ### Finish the install with CPAN
 
-You can now follow the instructions INSTALLING BIOPERL THE EASY WAY
+You can now follow the instructions INSTALLING BioPerl THE EASY WAY
 USING CPAN in the INSTALL file.
 
 ### Finish the install with BioPerl from GitHub
@@ -114,50 +105,52 @@ USING CPAN in the INSTALL file.
 For the bleeding edge version install manually using a ZIP file from the
 GitHub repository:
 
-1) Go to [GitHub](https://github.com/bioperl/bioperl-live) and press the
+1. Go to [GitHub](https://github.com/BioPerl/BioPerl-live) and press the
 `Download ZIP` button.
 
-2) Extract the archive in the normal way.
+2. Extract the archive in the normal way.
 
-3) In a cmd window `cd` to the directory you extracted to. Eg. if
-you extracted to directory 'bioperl-live', `cd bioperl-live`
+3. In a cmd window `cd` to the directory you extracted to. Eg. if
+you extracted to directory 'BioPerl-live', `cd BioPerl-live`
 
-4) Type `perl Build.PL` and answer the questions appropriately.
+4. Type `perl Build.PL` and answer the questions appropriately.
 
-5) Type `perl Build test`. All the tests should pass, but if they don't,
-[let us know](https://github.com/bioperl/bioperl-live/issues). Your usage of
-Bioperl may not be affected by the failure, so you can choose to continue
+5. Type `perl Build test`. All the tests should pass, but if they don't,
+[let us know](https://github.com/BioPerl/BioPerl-live/issues). Your usage of
+BioPerl may not be affected by the failure, so you can choose to continue
 anyway.
 
-6) Type `perl Build install` to install Bioperl.
+6. Type `perl Build install` to install BioPerl.
 
-5 Bioperl in Cygwin
+# BioPerl in Cygwin
 
 Cygwin is a Unix emulator and shell environment available free at
-http://www.cygwin.com. Some users claim that installation of Bioperl is
+http://www.cygwin.com. Some users claim that installation of BioPerl is
 easier within Cygwin than within Windows, but these may be users with UNIX
 backgrounds. A note on Cygwin: it doesn't write to your Registry, it doesn't
 alter your system or your existing files in any way, it doesn't create
-partitions, it simply creates a *cygwin/* directory and writes all of its
+partitions, it simply creates a `cygwin/` directory and writes all of its
 files to that directory. To uninstall Cygwin just delete that directory.
 
-To get Bioperl running first install the basic Cygwin package as well as
+To get BioPerl running first install the basic Cygwin package as well as
 the Cygwin `perl`, `make`, `binutils`, and `gcc` packages. Clicking the View
 button in the upper right of the installer window enables you to see
 details on the various packages. Then start up Cygwin and follow the
-Bioperl installation instructions for UNIX in Bioperl's INSTALL file.
+BioPerl installation instructions for UNIX in BioPerl's `INSTALL` file.
 
-Cygwin paths
+## Cygwin paths
 
 If you're trying to use some application or resource outside of the Cygwin
 directory and you're having a problem remember that Cygwin's path syntax
-may not be the correct one. Cygwin understands */home/jacky* or
-*/cygdrive/e/cygwin/home/jacky* (when referring to the E: drive) but the
-external resource may want *E:/cygwin/home/jacky*. So your *rc files may end
+may not be the correct one. Cygwin understands `/home/jacky` or
+`/cygdrive/e/cygwin/home/jacky` (when referring to the E: drive) but the
+external resource may want `E:/cygwin/home/jacky`. So your `*rc` files may end
 up with paths written in these different syntaxes, depending.
 
-For example, here's how to set the environmental variable TMPDIR, programs 
+For example, here's how to set the environmental variable TMPDIR, programs
 like BLAST and clustalw need a place to create temporary files:
 
-     setenv TMPDIR e:/cygwin/tmp    # csh, tcsh
-     export TMPDIR=e:/cygwin/tmp    # sh, bash
+```
+setenv TMPDIR e:/cygwin/tmp    # csh, tcsh
+export TMPDIR=e:/cygwin/tmp    # sh, bash
+```
diff --git a/INSTALL.md b/INSTALL.md
index ae26a95..ef5c3f7 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,24 +1,48 @@
-LATEST VERSION
+# BioPerl Installation
 
-The current version of BioPerl is 1.6.924 (https://metacpan.org/pod/BioPerl).
+There are two principle ways to get BioPerl onto your system. One (and
+the still most common) is to install it locally on your machine. To do
+this, refer to and follow the instructions below for installing BioPerl on
+Unix, Linux, and Mac OS X. For installing BioPerl on Windows, please
+read INSTALL.WIN. The other way is to use a Docker image with a
+BioPerl build, whether one we support or one you build yourself.
 
-BIOPERL INSTALLATION
+# Using BioPerl via Docker
 
-The following are instructions for installing BioPerl on
-Unix, Linux, and Mac OS X. Windows installation instructions can be 
-found in INSTALL.WIN.
+If you don't have Docker installed already, instructions for [how to install Docker] on Linux, MacOSX, and Windows are available online.
 
+We officially support several builds (latest, stable, and releases)
+hosted in the [bioperl/bioperl] repo on Docker Hub. These images do not
+have a pre-defined entrypoint. If you have a BioPerl script in the
+current directory, you can run it as simple as this:
 
-SYSTEM REQUIREMENTS
+```
+docker run -t --rm -v `pwd`:/work -w /work bioperl/bioperl perl my-script.pl
+```
 
- * `Perl 5.6.1 or higher` Version 5.8 or higher is highly
-   recommended. Modules are tested against version 5.8 and
+Or run an interactive shell:
+
+```
+docker run -ti --rm -v `pwd`:/work -w /work bioperl/bioperl bash
+```
+
+You can also build your own Docker image of BioPerl, using the same
+base image and pre-built dependencies that we use. Simply build off of
+the [bioperl/bioperl-deps] image.
+
+# Installing BioPerl locally
+
+Note that this documentation is for Unix, Linux, and MacOSX. For installing BioPerl on Windows, please read INSTALL.WIN.
+
+## System Requirments
+
+ * `Perl 5.6.1 or higher` Version 5.10 or higher is highly
+   recommended. Modules are tested against version 5.14 and
    above.
  * `make` For Mac OS X, this requires installing the Xcode Developer 
    Tools.
 
-
-PRELIMINARY PREPARATION
+## Preliminary Preparation
 
 These are optional, but regardless of your subsequent choice of
 installation method, it will help to carry out the following steps.
@@ -27,40 +51,68 @@ They will increase the likelihood of installation success
 
 * Upgrade CPAN:
 
+```
 perl -MCPAN -e shell
+```
 
 * Install or upgrade `Module::Build`, and make it your preferred installer:
 
+```
 cpan>install Module::Build
 cpan>o conf prefer_installer MB
 cpan>o conf commit
+```
+
+* Install the `expat` library by whatever method is appropriate for your system (e.g. `apt`, `yum`, `homebrew`).
+
+## Installing BioPerl the Easy Way
 
-* Install the *expat* library by whatever method is appropriate for your system (e.g. `apt`, `yum`, `homebrew`).
+We highly recommend using
+[cpanminus](https://metacpan.org/pod/distribution/App-cpanminus/bin/cpanm) for
+installing BioPerl and its dependencies. We also highly recommend (if possible)
+using a tool like [perlbrew](https://perlbrew.pl) to locally install a modern
+version of perl (a version that is higher than perl 5.16).  The linked
+pages describe how to install each tool; make sure if you install perlbrew that
+you follow up with installing `cpanm`:
 
+```
+perlbrew install-cpanm
+```
 
-INSTALLING BIOPERL THE EASY WAY USING CPAN
+Then, you can install BioPerl:
 
-You can use the CPAN shell to install BioPerl. For example:
+```
+cpanm Bio::Perl
+```
 
+You can also use the older CPAN shell to install BioPerl. For example:
+
+```
 perl -MCPAN -e shell
+```
 
 Or you might have the `cpan` alias installed:
 
+```
 cpan
+```
 
 Then find the name of the latest BioPerl package:
 
+```
 cpan>d /bioperl/
-
  ....
 
  Distribution    CJFIELDS/BioPerl-1.6.901.tar.gz
  Distribution    CJFIELDS/BioPerl-1.6.922.tar.gz
  Distribution    CJFIELDS/BioPerl-1.6.924.tar.gz
+```
 
 And install the most recent:
 
+```
 cpan>install CJFIELDS/BioPerl-1.6.924.tar.gz
+```
 
 If you've installed everything perfectly and all the network
 connections are working then you will pass all the tests run in the
@@ -72,76 +124,96 @@ of BioPerl.
 If there's a failed test and you think that the failed test will not 
 affect how you intend to use BioPerl then do:
 
+```
 cpan>force install C/CJ/CJFIELDS/BioPerl-1.6.923.tar.gz
+```
 
 If you're concerned about a failed test and need assistance or advice
 then contact bioperl-l at bioperl.org, and provide us the detailed
 results of the failed install.
 
+## Installing BioPerl from Github
 
-INSTALLING BIOPERL FROM GITHUB
+**NOTE:** We generally do not recommend installing the latest code from Github
+unless you absolutely need the latest bug fixes. 
 
 The very latest version of Bioperl is at github.com. If you want this 
-version then download it from https://github.com/bioperl/bioperl-live
-as a *zip file, or retrieve it using the command line:
+version then download it from https://github.com/bioperl/bioperl-live as a
+`tar.gz` or `zip` file, or retrieve it using the command line:
 
+```
 git clone https://github.com/bioperl/bioperl-live.git
 cd bioperl-live
+```
 
-If you've downloaded the *zip file then unzip that and cd to the
-BioPerl directory.
+### Using cpanm
+
+If you have `cpanm`, you can install within the checkout directory by simply using:
+
+```
+cpanm --interactive .
+```
+
+to run interative installation, or you can leave out the `--interactive` flag to accept the defaults.
+
+### Using the Installation Script
 
 Issue the build commands:
 
+```
 perl Build.PL
+```
 
 You will be asked a few questions about installing BioPerl scripts
-and running various test suites, hit *return* to accept the defaults.
+and running various test suites, hit `return` to accept the defaults.
 
 Test:
 
+```
 ./Build test
+```
 
 Install:
 
+```
 ./Build install
+```
 
 You may need root permissions in order to run `./Build install`, so you 
 will want to talk to your systems manager if you don't have the necessary
 privileges. Or you can install the package in your own home
-directory, see INSTALLING BIOPERL USING local::lib.
-
+directory, see INSTALLING BIOPERL USING `local::lib`.
 
-INSTALLING BIOPERL USING local::lib
+## Installing Bioperl using `local::lib`
 
 If you lack permission to install Perl modules into the standard
 system directories you can install them in your home directory
-using `local::lib`. The instructions for first installing
-`local::lib` are found here:
-
-https://metacpan.org/pod/local::lib
+using [local::lib](https://metacpan.org/pod/local::lib). The instructions for first installing
+`local::lib` are found in the link.
 
 Once `local::lib` is installed you can install BioPerl using a 
 command like this:
 
+```
 perl -MCPAN -Mlocal::lib -e 'CPAN::install(C/CJ/CJFIELDS/BioPerl-1.6.924.tar.gz)'
+```
 
-INSTALLING BIOPERL SCRIPTS
+## Installing BioPerl Scripts
 
 BioPerl comes with a set of production-quality scripts that are
 kept in the scripts/ directory. You can install these scripts if you'd
 like, simply answer the questions during `perl Build.PL`.
 The installation directory can be specified by:
 
-perl Build.PL
-./Build install --install_path script=/foo/scripts
-
-By default they install to */usr/bin* or similar, depending on platform.
+```
+perl Build.PL ./Build install --install_path script=/foo/scripts
+```
 
+By default they install to `/usr/bin` or similar, depending on platform.
 
-THE TEST SYSTEM
+## The Test System
 
-The BioPerl test system is located in the *t/* directory and is
+The BioPerl test system is located in the `t/` directory and is
 automatically run whenever you execute the `./Build test` command.
 
 The tests have been organized into groups
@@ -149,15 +221,25 @@ based upon the specific task or class the module being tested belongs
 to. If you want to investigate the behavior of a specific test such as
 the Seq test you would type:
 
+```
 ./Build test --test_files t/Seq/Seq.t --verbose
+```
 
 The `--test_files` argument can be used multiple times to try a set of test 
 scripts in one go. The `--verbose` arguement outputs the detailed test results, instead of just the summary you see during `./Build test`.
 
-The `--test-files` argument can also work as a glob. For instance, to
-run tests on all SearchIO modules, use the following:
+The `--test-files` argument can also work as a glob. For instance, to run tests on all SearchIO modules, use the following:
 
+```
 ./Build test --test_files t/SearchIO* --verbose
+```
+
+You can also use the command-line tool `prove` to run tests as well, which
+is quite useful if you are developing code:
+
+```
+prove -lrv t/SearchIO* 
+```
 
 If you are trying to learn how to use a module, often the test suite
 is a good place to look. All good extreme programmers try and write a
@@ -174,3 +256,7 @@ will require that new modules come with a test suite with some minimal
 tests.  Modules that lack adequate tests or could otherwise be
 considered 'unstable' will be moved into a separate developer
 distribution until adequate tests are added and the API stablizes.
+
+[how to install Docker]: https://docs.docker.com/engine/installation/
+[bioperl/bioperl]: https://hub.docker.com/r/bioperl/bioperl/
+[bioperl/bioperl-deps]: https://hub.docker.com/r/bioperl/bioperl-deps/
diff --git a/MANIFEST b/MANIFEST
index ff2facd..f57b215 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -681,7 +681,6 @@ Bio/Tools/ECnumber.pm
 Bio/Tools/EMBOSS/Palindrome.pm
 Bio/Tools/EPCR.pm
 Bio/Tools/Eponine.pm
-Bio/Tools/ERPIN.pm
 Bio/Tools/Est2Genome.pm
 Bio/Tools/ESTScan.pm
 Bio/Tools/Fgenesh.pm
@@ -700,7 +699,6 @@ Bio/Tools/HMMER/Domain.pm
 Bio/Tools/HMMER/Results.pm
 Bio/Tools/HMMER/Set.pm
 Bio/Tools/Hmmpfam.pm
-Bio/Tools/Infernal.pm
 Bio/Tools/ipcress.pm
 Bio/Tools/isPcr.pm
 Bio/Tools/IUPAC.pm
@@ -735,7 +733,6 @@ Bio/Tools/pSW.pm
 Bio/Tools/QRNA.pm
 Bio/Tools/RandomDistFunctions.pm
 Bio/Tools/RepeatMasker.pm
-Bio/Tools/RNAMotif.pm
 Bio/Tools/Run/GenericParameters.pm
 Bio/Tools/Run/ParametersI.pm
 Bio/Tools/Run/README
@@ -1325,6 +1322,7 @@ t/data/fastq/example.fasta
 t/data/fastq/example.fastq
 t/data/fastq/example.qual
 t/data/fastq/illumina_faked.fastq
+t/data/fastq/RT98876.fastq
 t/data/fastq/sanger_93.fastq
 t/data/fastq/sanger_faked.fastq
 t/data/fastq/solexa_example.fastq
@@ -2050,7 +2048,6 @@ t/Tools/Pseudowise.t
 t/Tools/QRNA.t
 t/Tools/RandDistFunctions.t
 t/Tools/RepeatMasker.t
-t/Tools/rnamotif.t
 t/Tools/Run/RemoteBlast.t
 t/Tools/Run/RemoteBlast_rpsblast.t
 t/Tools/Seg.t
@@ -2093,5 +2090,6 @@ t/Variation/SeqDiff.t
 t/Variation/SNP.t
 t/Variation/Variation_IO.t
 travis_scripts/dependency_installs
+travis_scripts/trigger-dockerhub.sh
 META.yml
 META.json
diff --git a/META.json b/META.json
index 31b3754..aef7f69 100644
--- a/META.json
+++ b/META.json
@@ -1363,7 +1363,7 @@
       },
       "Bio::Root::Build" : {
          "file" : "Bio/Root/Build.pm",
-         "version" : "1.007000_004"
+         "version" : "1.007000"
       },
       "Bio::Root::Exception" : {
          "file" : "Bio/Root/Exception.pm"
@@ -1394,7 +1394,7 @@
       },
       "Bio::Root::Version" : {
          "file" : "Bio/Root/Version.pm",
-         "version" : "1.007000_004"
+         "version" : "1.007000"
       },
       "Bio::Search::BlastStatistics" : {
          "file" : "Bio/Search/BlastStatistics.pm"
@@ -2143,9 +2143,6 @@
       "Bio::Tools::EPCR" : {
          "file" : "Bio/Tools/EPCR.pm"
       },
-      "Bio::Tools::ERPIN" : {
-         "file" : "Bio/Tools/ERPIN.pm"
-      },
       "Bio::Tools::ESTScan" : {
          "file" : "Bio/Tools/ESTScan.pm"
       },
@@ -2206,9 +2203,6 @@
       "Bio::Tools::IUPAC" : {
          "file" : "Bio/Tools/IUPAC.pm"
       },
-      "Bio::Tools::Infernal" : {
-         "file" : "Bio/Tools/Infernal.pm"
-      },
       "Bio::Tools::Lucy" : {
          "file" : "Bio/Tools/Lucy.pm"
       },
@@ -2290,9 +2284,6 @@
       "Bio::Tools::QRNA" : {
          "file" : "Bio/Tools/QRNA.pm"
       },
-      "Bio::Tools::RNAMotif" : {
-         "file" : "Bio/Tools/RNAMotif.pm"
-      },
       "Bio::Tools::RandomDistFunctions" : {
          "file" : "Bio/Tools/RandomDistFunctions.pm"
       },
@@ -2501,11 +2492,11 @@
          "file" : "Bio/DB/GFF/Adaptor/berkeleydb.pm"
       }
    },
-   "release_status" : "testing",
+   "release_status" : "stable",
    "resources" : {
       "license" : [
          "http://dev.perl.org/licenses/"
       ]
    },
-   "version" : "1.007000_004"
+   "version" : "1.007000"
 }
diff --git a/META.yml b/META.yml
index deb8505..f4fc9c2 100644
--- a/META.yml
+++ b/META.yml
@@ -875,7 +875,7 @@ provides:
     file: Bio/Restriction/IO/withrefm.pm
   Bio::Root::Build:
     file: Bio/Root/Build.pm
-    version: 1.007000_004
+    version: '1.007000'
   Bio::Root::Exception:
     file: Bio/Root/Exception.pm
   Bio::Root::HTTPget:
@@ -896,7 +896,7 @@ provides:
     file: Bio/Root/Utilities.pm
   Bio::Root::Version:
     file: Bio/Root/Version.pm
-    version: 1.007000_004
+    version: '1.007000'
   Bio::Search::BlastStatistics:
     file: Bio/Search/BlastStatistics.pm
   Bio::Search::BlastUtils:
@@ -1395,8 +1395,6 @@ provides:
     file: Bio/Tools/EMBOSS/Palindrome.pm
   Bio::Tools::EPCR:
     file: Bio/Tools/EPCR.pm
-  Bio::Tools::ERPIN:
-    file: Bio/Tools/ERPIN.pm
   Bio::Tools::ESTScan:
     file: Bio/Tools/ESTScan.pm
   Bio::Tools::Eponine:
@@ -1437,8 +1435,6 @@ provides:
     file: Bio/Tools/Hmmpfam.pm
   Bio::Tools::IUPAC:
     file: Bio/Tools/IUPAC.pm
-  Bio::Tools::Infernal:
-    file: Bio/Tools/Infernal.pm
   Bio::Tools::Lucy:
     file: Bio/Tools/Lucy.pm
   Bio::Tools::MZEF:
@@ -1493,8 +1489,6 @@ provides:
     file: Bio/Tools/Pseudowise.pm
   Bio::Tools::QRNA:
     file: Bio/Tools/QRNA.pm
-  Bio::Tools::RNAMotif:
-    file: Bio/Tools/RNAMotif.pm
   Bio::Tools::RandomDistFunctions:
     file: Bio/Tools/RandomDistFunctions.pm
   Bio::Tools::RepeatMasker:
@@ -1680,4 +1674,4 @@ requires:
   perl: v5.6.1
 resources:
   license: http://dev.perl.org/licenses/
-version: 1.007000_004
+version: '1.007000'
diff --git a/maintenance/authors.pl b/maintenance/authors.pl
index 9499722..8783452 100755
--- a/maintenance/authors.pl
+++ b/maintenance/authors.pl
@@ -124,7 +124,7 @@ print Dumper \%NEWAUTHORS;
 # this is where the action is
 #
 sub findauthors {
-    my ($filename) = @_;
+    my ($filename) = $_;
     return unless ($filename =~ /\.PLS$/ or $filename =~ /\.p[ml]$/);
     return unless -e $filename;
 
diff --git a/scripts/DB-HIV/bp_hivq.pl b/scripts/DB-HIV/bp_hivq.pl
index 73f7d3e..11d6e19 100644
--- a/scripts/DB-HIV/bp_hivq.pl
+++ b/scripts/DB-HIV/bp_hivq.pl
@@ -1,6 +1,4 @@
 #!perl
-
-
 # command-line script for HIV sequence queries
 # using HIV.pm and HIVQuery.pm
 
@@ -53,14 +51,14 @@ are described below.
 =head2 TIPS
 
 The LANL database is pretty complex and extensive. Use the C<find> facility to
-explore the available database tables and fields. To identify aliases for a particular field, use C<find alias [fieldname]>. For example, to find a short alias to the 
+explore the available database tables and fields. To identify aliases for a particular field, use C<find alias [fieldname]>. For example, to find a short alias to the
 weirdly named field C<seq_sample.ssam_second_receptor>, do
 
  hivq> find alias seq_sample.ssam_second_receptor
 
 which returns
 
- coreceptor             second_receptor 
+ coreceptor             second_receptor
 
 Now, instead of the following query
 
@@ -72,7 +70,7 @@ you know you can do
 
 Use the C<outfile> command to set the file that receives the retrieved
 sequences. You can change the current output file simply by issuing a
-new C<outfile> command during the session. The output file defaults to 
+new C<outfile> command during the session. The output file defaults to
 standard output.
 
 Use the C<query> command to validate a query without hitting the
@@ -89,10 +87,10 @@ line. Then execute the following from the shell:
 
 =head1 COMMANDS
 
-Here is a complete list of commands. Options in single brackets (C<[req_option]>) are 
+Here is a complete list of commands. Options in single brackets (C<[req_option]>) are
 required; options in double brackets (C<[[opt_option]]>) are optional.
 
- confirm            : Toggle interactive confirmation before 
+ confirm            : Toggle interactive confirmation before
                       executing queries
  exit               : Quit script
  find               : Explore database schema
@@ -101,12 +99,12 @@ required; options in double brackets (C<[[opt_option]]>) are optional.
   find fields [table]         Display all fields in [table]
   find alias [field]          Display valid aliases for [field]
  help [[command]]   : Show command help
-                      if [[command]] not specified, list all 
+                      if [[command]] not specified, list all
                       available commands
  id                 : Display current session id
  outfile [filename] : Set file for collecting retrieved data
  ping               : Check if LANL DB is available
- prerun [[query]]   : Execute query but retreive hit count only
+ prerun [[query]]   : Execute query but retrieve hit count only
                       if [[query]] not specified, use current query
  query [query]      : Validate and set current query
  run [[query]]      : Execute query and retrieve data
@@ -441,7 +439,7 @@ while ( !$done ) {
 sub error {
     my $msg = shift;
     if ($msg =~ /MSG:/) {
-	($msg) = grep (/^MSG:/, split(/\n|\r/,$msg));	
+	($msg) = grep (/^MSG:/, split(/\n|\r/,$msg));
 	$msg =~ s/^MSG: *//;
 	$msg =~ s/\sat\s.*$//;
     }
@@ -452,7 +450,7 @@ sub error {
 sub outputPrerun {
     print (($state{curct} ? $state{curct} : "No")
 	. " sequence"
-	. ($state{curct}>1 ? "s" : "") 
+	. ($state{curct}>1 ? "s" : "")
 	. " returned\n");
     print "Query: ".$state{query}."\n";
     return 1;
@@ -470,7 +468,7 @@ sub outputSeqs {
 	    foreach my $an ($seq->annotation->get_keys($cat)) {
 		next if ($an eq 'accession');
 		my $value = $seq->annotation->get_value($cat, $an);
-		# next line: kludge to skip if there's an annotation 
+		# next line: kludge to skip if there's an annotation
 		# object instead of a value (I believe this is a bug)
 		next if ref($value);
 		$nameline .= "\t".join('=', "'$an'", "'".$value."'");
@@ -602,7 +600,7 @@ sub outputInColumns {
     }
     return 1;
 }
-    
+
 sub debug {
     print STDERR shift()."\n" if $opt_v;
     return;
diff --git a/scripts/DB/bp_biofetch_genbank_proxy.pl b/scripts/DB/bp_biofetch_genbank_proxy.pl
index 1275c91..d21de83 100644
--- a/scripts/DB/bp_biofetch_genbank_proxy.pl
+++ b/scripts/DB/bp_biofetch_genbank_proxy.pl
@@ -57,7 +57,7 @@ foreach (@ids) {
 # handle the remainder
 @ids = grep {!$GOT{$_}} @ids;
 if (@ids) {
-  my $request = POST('http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
+  my $request = POST('https://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
 		     [rettype    => $MAPPING{$db}{rettype},
 		      db         => $MAPPING{$db}{db},
 		      tool       => 'bioperl',
@@ -237,7 +237,7 @@ database access services, one for data source "genbank" (nucleotide
 entries) and the other for data source "genpep" (protein entries).
 
 This script works by forwarding its requests to NCBI's eutils script,
-which lives at http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi.
+which lives at https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi.
 It then reformats the output according to the BioFetch format so the
 sequences can be processed and returned by the Bio::DB::BioFetch
 module.  Returned entries are temporarily cached on the Web server's
diff --git a/scripts/DB/bp_biogetseq.pl b/scripts/DB/bp_biogetseq.pl
index 7c7897b..3513e5b 100644
--- a/scripts/DB/bp_biogetseq.pl
+++ b/scripts/DB/bp_biogetseq.pl
@@ -41,7 +41,7 @@ bp_biogetseq - sequence retrieval using OBDA registry
 
 =head1 DESCRIPTION
 
-This script retrives sequences from the source defined by users
+This script retrieves sequences from the source defined by users
 registry setup.  The current alternatives are from a local indexed
 file, sql database or over the web.
 
diff --git a/scripts/seq/bp_extract_feature_seq.pl b/scripts/seq/bp_extract_feature_seq.pl
index 2e3ea1c..acaf424 100644
--- a/scripts/seq/bp_extract_feature_seq.pl
+++ b/scripts/seq/bp_extract_feature_seq.pl
@@ -27,7 +27,7 @@ Specifies the sequence file to be read.
 
 =item B<--format>
 
-Format of the file specifed by B<--input>. If not given, it will try to guess the
+Format of the file specified by B<--input>. If not given, it will try to guess the
 correct format from the file extension.
 
 =item B<--feature>
@@ -80,7 +80,7 @@ my $in = new Bio::SeqIO(-file => $input,
 my $out;
 if ($output ) {
     $out = new Bio::SeqIO(-file => ">$output", -format => 'fasta');
-} else { 
+} else {
     $out = new Bio::SeqIO(-format => 'fasta'); # use STDOUT for output
 }
 
@@ -91,7 +91,7 @@ while( my $seq = $in->next_seq ) {
         my $s = $f->spliced_seq;
         if( $featuretype =~ /gene|CDS/ ) {
             $s->display_id($f->has_tag('gene') ? join(',',sort $f->each_tag_value('gene')) :
-                           $f->has_tag('label') ? join(',',$f->each_tag_value('label')): 
+                           $f->has_tag('label') ? join(',',$f->each_tag_value('label')):
                            $s->display_id);
         } else {
             $s->display_id(sprintf("%s_%s_%d",
diff --git a/scripts/seq/bp_seqcut.pl b/scripts/seq/bp_seqcut.pl
index 3a8d266..401e0fb 100644
--- a/scripts/seq/bp_seqcut.pl
+++ b/scripts/seq/bp_seqcut.pl
@@ -1,6 +1,4 @@
 #!/usr/bin/env perl
-use strict;
-use warnings;
 
 =head1 NAME
 
@@ -49,17 +47,18 @@ email or the web:
 =head1 EDIT HISTORY
 
 2010-11-22 - Matt Oates
-	First features added.
-=cut
-
+First features added.
 
+=head1 DEPENDENCY
 
-# Includes
-=head1 DEPENDANCY
 B<Getopt::Long> Used to parse command line options.
 B<Pod::Usage> Used for usage and help output.
 B<Bio::SeqIO> Used to cut up sequences and parse FASTA.
+
 =cut
+
+use strict;
+use warnings;
 use Getopt::Long;                     #Deal with command line options
 use Pod::Usage;                       #Print a usage man page from the POD comments after __END__
 use Bio::SeqIO;
@@ -88,10 +87,10 @@ my @files = @ARGV;
 #Print out some help if it was asked for or if no arguments were given.
 pod2usage(-exitstatus => 0, -verbose => 2) if $help;
 
-pod2usage(-exitstatus => 0, -verbose => 1, -msg => 'Please specify the sequence files you wish to cut.') 
+pod2usage(-exitstatus => 0, -verbose => 1, -msg => 'Please specify the sequence files you wish to cut.')
     unless scalar @files;
 
-pod2usage(-exitstatus => 0, -verbose => 1, -msg => 'Please specify the region you wish to cut -s 1 -e 10 or 1-10.') 
+pod2usage(-exitstatus => 0, -verbose => 1, -msg => 'Please specify the region you wish to cut -s 1 -e 10 or 1-10.')
     unless defined $end;
 
 my $out = Bio::SeqIO->newFh(-file => ">$outfile", -format => $format) or die "Couldn't open selected output sequence file.";
diff --git a/scripts/taxa/bp_taxid4species.pl b/scripts/taxa/bp_taxid4species.pl
index eed3607..1e06287 100644
--- a/scripts/taxa/bp_taxid4species.pl
+++ b/scripts/taxa/bp_taxid4species.pl
@@ -23,7 +23,7 @@ die("$USAGE\n") if $help;
 
 my $ua = new LWP::UserAgent();
 
-my $urlbase = 'http://www.ncbi.nlm.nih.gov/entrez/eutils/';
+my $urlbase = 'https://www.ncbi.nlm.nih.gov/entrez/eutils/';
 my $esearch = 'esearch.fcgi?db=taxonomy&usehistory=y&term=';
 my $esummary = 'esummary.fcgi?db=taxonomy&query_key=QUERYKEY&WebEnv=WEBENV';
 
diff --git a/scripts/utilities/bp_netinstall.pl b/scripts/utilities/bp_netinstall.pl
index 0e69be2..3d49947 100644
--- a/scripts/utilities/bp_netinstall.pl
+++ b/scripts/utilities/bp_netinstall.pl
@@ -8,13 +8,13 @@ bp_netinstall.pl
 
   bp_netinstall.pl -b|--build_param_str BUILD_STRING [options]
 
-options: 
+  options:
 
- -h|--help                Show this message 
- -d|--dev                 Use the development version of bioperl from git 
+ -h|--help                Show this message
+ -d|--dev                 Use the development version of bioperl from git
  --build_param_str=<args> Parameters that are passed in at 'perl Build.PL'
  --install_param_str=<args>
-                          Use this string to predefine './Build install' 
+                          Use this string to predefine './Build install'
                             parameters such as 'install_base' for
                             bioperl installation
  --bioperl_path           Path to BioPerl tarball (will not download BioPerl)
@@ -39,8 +39,6 @@ Scott Cain scain at cpan.org
 
 =cut
 
-
-
 # Universal Net-based installer
 # Save this to disk as "bp_netinstall.pl" and run:
 #   perl bp_netinstall.pl
@@ -77,7 +75,7 @@ BEGIN {
         or pod2usage(2);
   pod2usage(2) if $show_help;
 
-  $perl_path = $Config{perlpath}; 
+  $perl_path = $Config{perlpath};
 
   print STDERR "\nAbout to install BioPerl and all its prerequisites.\n";
   print STDERR "\nYou will be asked various questions during this process. You can almost always";
@@ -108,7 +106,7 @@ BEGIN {
 
   $working_dir = getcwd;
 
-  $tmpdir = tempdir(CLEANUP=>1) 
+  $tmpdir = tempdir(CLEANUP=>1)
     or die "Could not create temporary directory: $!";
 
   $binaries = $Config{'binexp'};
@@ -312,7 +310,7 @@ sub do_get_distro {
             exit(-1);
         }
         $distribution = ($local_name =~ /gbrowse/)
-                      ? "Generic-Genome-Browser" : "bioperl-live"; 
+                      ? "Generic-Genome-Browser" : "bioperl-live";
         chdir $tmpdir;
         extract_tarball($local_name,$distribution);
     }
@@ -324,7 +322,7 @@ sub do_get_distro {
         my $filename = 'bioperl-live.tar.gz'; # =determine_filename();
         my $url = BIOPERL_LIVE_URL."/$filename";
 
-        my $rc = mirror($url, $filename); 
+        my $rc = mirror($url, $filename);
         unless ($rc == RC_OK or $rc == RC_NOT_MODIFIED){
             print STDERR "Failed to get nightly bioperl-live file: $rc\n";
             return undef;
@@ -353,7 +351,7 @@ sub determine_filename {
   die "Could not get directory listing of bioperl nightly build url: $rc\n"
       unless ($rc == RC_OK or $rc == RC_NOT_MODIFIED);
 
-  my $filename; 
+  my $filename;
   open my $LIST, '<', $listing or die "Could not read file '$listing': $!\n";
   while (my $line = <$LIST>) {
     if ($line =~ /href="(bioperl-live.*?\.tar\.gz)"/) {
@@ -362,7 +360,7 @@ sub determine_filename {
     }
   }
   close $LIST;
-  unlink $listing; 
+  unlink $listing;
   return $filename;
 }
 
@@ -377,7 +375,7 @@ sub extract_tarball {
 
   if ($extracted[0]->{'name'} =~ /^(bioperl.*?)\//) {
     my $bioperl_dir = $1;
-    move($bioperl_dir, $distribution) or die "couldn't move bioperl dir: $@"; 
+    move($bioperl_dir, $distribution) or die "couldn't move bioperl dir: $@";
   }
 
   chdir $distribution
diff --git a/scripts/utilities/bp_search2gff.pl b/scripts/utilities/bp_search2gff.pl
index 2bcec5a..c91cbd3 100644
--- a/scripts/utilities/bp_search2gff.pl
+++ b/scripts/utilities/bp_search2gff.pl
@@ -12,7 +12,7 @@ Usage:
 
 =head1 DESCRIPTION
 
-This script will turn a SearchIO report (BLAST, FASTP, SSEARCH, 
+This script will turn a SearchIO report (BLAST, FASTP, SSEARCH,
 AXT, WABA) into GFF.
 
 The options are:
@@ -98,7 +98,7 @@ my (
     $onehsp,       # flag: whether to consider only the first HSP for a hit
     $quiet,        # flag: run quietly
     $help          # flag: show help screen
-);                 
+);
 
 # set defaults:
 $format    = 'blast';
diff --git a/t/AlignIO/fasta.t b/t/AlignIO/fasta.t
index 8ad9d45..af00644 100644
--- a/t/AlignIO/fasta.t
+++ b/t/AlignIO/fasta.t
@@ -6,7 +6,7 @@ BEGIN {
 	use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 10);
+    test_begin(-tests => 12);
 	
 	use_ok('Bio::AlignIO::fasta');
 }
@@ -21,12 +21,16 @@ $str = Bio::AlignIO->new(
 		 -format => 'fasta');
 $aln = $str->next_aln();
 isa_ok($aln,'Bio::Align::AlignI');
+is $aln->get_seq_by_pos(1)->display_id, 'AK1H_ECOLI/114-431', 
+  "fasta input test ";
 is $aln->get_seq_by_pos(1)->get_nse, 'AK1H_ECOLI/114-431/1-318', 
   "fasta input test ";
 is ($aln->get_seq_by_pos(1)->description, 'DESCRIPTION HERE', 
     "fasta input test for description");
-is ($aln->get_seq_by_pos(11)->display_id, 'AK_YEAST',
+is ($aln->get_seq_by_pos(11)->display_id, 'AK_YEAST/134-472',
     "fasta input test for id");
+is $aln->get_seq_by_pos(11)->get_nse, 'AK_YEAST/134-472/134-472', 
+  "fasta input test, captures formatted start/end";
 
 is ($aln->get_seq_by_pos(2)->end, 318,
     "fasta input test for end");
diff --git a/t/LocalDB/Fasta.t b/t/LocalDB/Fasta.t
index 1a1ed80..212f82e 100644
--- a/t/LocalDB/Fasta.t
+++ b/t/LocalDB/Fasta.t
@@ -2,7 +2,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin( -tests => 107,
+    test_begin( -tests => 109,
                 -requires_modules => [qw(Bio::DB::Fasta Bio::SeqIO)] );
 }
 use strict;
@@ -150,13 +150,21 @@ my $test_files = [
     # Test stream
     ok my $db = Bio::DB::Fasta->new( $test_file, -reindex => 1);
     ok my $stream = $db->get_PrimarySeq_stream;
-    isa_ok $stream, 'Bio::DB::Indexed::Stream';
+    isa_ok $stream, 'Bio::DB::Indexed::Stream';    
     my $count = 0;
-    while (my $seq = $stream->next_seq) {
+    
+    # note use of modified iterator, needed b/c of overloading
+    while (defined(my $seq = $stream->next_seq)) {
         $count++;
     }
-    is $count, 5;
-
+    is $count, 7;
+    
+    # bug #170 (Github)
+    # retrieve seq with ID of 0
+    my $seq = $db->get_Seq_by_id(0);
+    isa_ok $seq, 'Bio::PrimarySeq::Fasta';
+    is $seq->display_id, 0;
+    
     # ActivePerl will not allow deletion if the tie-hash is still active
     $db->DESTROY;
     # Strawberry Perl temporary file
@@ -256,6 +264,8 @@ my $test_files = [
     ok $db->get_all_ids;
     my @ids = sort $db->get_all_primary_ids();
     is_deeply \@ids, [ qw(
+        0
+        1
         123
         CEESC12R
         CEESC13F
diff --git a/t/LocalDB/Taxonomy/sqlite.t b/t/LocalDB/Taxonomy/sqlite.t
index ca02db2..49a1884 100644
--- a/t/LocalDB/Taxonomy/sqlite.t
+++ b/t/LocalDB/Taxonomy/sqlite.t
@@ -8,7 +8,8 @@ BEGIN {
     use Bio::Root::Test;
 
     test_begin(
-        -requires_modules => [qw(DB_File DBI DBD::SQLite )]
+        
+        -requires_modules => [qw( 5.010 DB_File DBI DBD::SQLite )]
     );
 
     use_ok('Bio::DB::Taxonomy');
diff --git a/t/RemoteDB/MeSH.t b/t/RemoteDB/MeSH.t
index 0791093..d9eeda1 100755
--- a/t/RemoteDB/MeSH.t
+++ b/t/RemoteDB/MeSH.t
@@ -4,15 +4,15 @@
 use strict;
 
 BEGIN {
-        use lib '.';
-        use Bio::Root::Test;
-        
-        test_begin(-tests => 5,
-                        -requires_modules => [qw(IO::String
-                                                LWP::UserAgent
-                        HTTP::Request::Common)],
-                           -requires_networking => 1);
-        
+    use lib '.';
+    use Bio::Root::Test;
+
+    test_begin(-tests => 5,
+               -requires_modules => [qw(IO::String
+                                        LWP::UserAgent
+                                        HTTP::Request::Common)],
+               -requires_networking => 1);
+
     use_ok('Bio::DB::MeSH');
 }
 
@@ -24,7 +24,8 @@ SKIP: {
     my $t;
     eval {$t = $mesh->get_exact_term('Dietary Fats');};
     skip "Couldn't connect to MeSH with Bio::DB::MeSH. Skipping those tests", 3 if $@;
-    is $t->each_twig(), 2;
+    is $t->each_twig(), 3;
+
     eval {$t = $mesh->get_exact_term("Sinus Thrombosis, Intracranial");};
     skip "Couldn't connect to MeSH with Bio::DB::MeSH. Skipping those tests", 2 if $@;
     like $t->description, qr/Thrombus/i;
diff --git a/t/RemoteDB/Taxonomy.t b/t/RemoteDB/Taxonomy.t
index f7b5951..3a7ddcf 100644
--- a/t/RemoteDB/Taxonomy.t
+++ b/t/RemoteDB/Taxonomy.t
@@ -8,7 +8,7 @@ BEGIN {
     use Bio::Root::Test;
 
     test_begin(
-        -tests            => 202,
+        -tests            => 214,
         -requires_modules => [qw(DB_File
                                  LWP::UserAgent
                                  XML::Twig )]
@@ -103,7 +103,7 @@ for my $db ($db_entrez, $db_flatfile) {
         is ${$n->name('scientific')}[0], $n->node_name;
 
         my %common_names = map { $_ => 1 } $n->common_names;
-        is keys %common_names, 3, ref($db).": common names";
+        cmp_ok keys %common_names, '>=', 3, ref($db).": common names";
         ok exists $common_names{human};
         ok exists $common_names{man};
 
@@ -446,3 +446,29 @@ ok $node2 = $db_list->get_taxon( -names => [ 'o__Chroococcales', 'g__Microcoleus
 is $node2->scientific_name, $node1->scientific_name;
 is $node2->id, $node1->id;
 is $node2->internal_id, $node1->internal_id;
+
+# tests for #182
+SKIP: {
+    test_skip(-tests => 12, -requires_networking => 1);
+
+    my $db=Bio::DB::Taxonomy->new(-source=>"entrez");
+    
+    my @taxa = qw(viruses Deltavirus unclassified plasmid);
+    
+    for my $taxon (@taxa) {
+        test_taxid($db, $taxon);
+    }
+    
+    sub test_taxid {
+        my ($db, $taxa) = @_;
+        my @taxonids = $db->get_taxonids($taxa);
+        cmp_ok(scalar(@taxonids), '>', 0, "Got IDs returned for $taxa:".join(',', @taxonids));
+        my $taxon; 
+        lives_ok { $taxon = $db->get_taxon(-taxonid => pop @taxonids) } "IDs generates a Bio::Taxonomy::Node";
+        if (defined $taxon) {
+            like( $taxon->scientific_name, qr/$taxa/i, "Name returned matches $taxa");
+        } else {
+            ok(0, "No taxon object returned for $taxa");
+        }
+    }
+}
diff --git a/t/SeqIO/fastq.t b/t/SeqIO/fastq.t
index 5a879c2..6e2372f 100644
--- a/t/SeqIO/fastq.t
+++ b/t/SeqIO/fastq.t
@@ -7,7 +7,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin( -tests => 140 );
+    test_begin( -tests => 149 );
 
     use_ok('Bio::SeqIO::fastq');
     use_ok('Bio::Seq::Quality');
@@ -34,6 +34,19 @@ my %example_files = (
         'desc'          => undef,
         'count'         => 1
         },
+    RT98876             => {
+        'variant'       => 'sanger',
+        'seq'           => 'CCGCCATTTCTTCAAATCTTTTCTTTTCTTTAGGAGTCATCAATTTCCAT'.
+                           'TTCTCTGCACATTTCTTTGAAAATTA',
+        'qual'          => '31 34 34 34 34 34 34 34 34 33 34 34 34 34 34 34 '.
+                           '34 34 34 34 34 32 32 34 34 34 34 34 34 34 34 34 '.
+                           '30 34 34 34 34 34 34 34 34 34 34 34 34 34 32 32 '.
+                           '34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 '.
+                           '34 34 34 34 33 30 30 27 33 34 29 2',
+        'display_id'    => 'Illumina_SRR125365.38',
+        'desc'          => 's_5_1_0001_qseq_37 length=76',
+        'count'         => 1
+        },
     test1_sanger            => {
         'variant'       => 'sanger',
         'seq'           => 'TATTGACAATTGTAAGACCACTAAGGATTTTTGGGCGGCAGCGACTTGGA'.
@@ -432,3 +445,4 @@ lives_and {my $seq = $in->next_seq;
            is($seq->seq, 'G');} 'edge case; single 0 in quality fails';
 
 
+
diff --git a/t/SeqTools/CodonTable.t b/t/SeqTools/CodonTable.t
index 11652a7..82d4977 100644
--- a/t/SeqTools/CodonTable.t
+++ b/t/SeqTools/CodonTable.t
@@ -7,7 +7,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 81);
+    test_begin(-tests => 84);
 
     use_ok('Bio::Tools::CodonTable');
     use_ok('Bio::CodonUsage::IO');
@@ -160,16 +160,21 @@ ok $test;
 # boolean tests
 $myCodonTable->id(1); # Standard table
 
-ok $myCodonTable->is_start_codon('ATG');
-is $myCodonTable->is_start_codon('GGH'), 0;
-ok $myCodonTable->is_start_codon('HTG');
-is $myCodonTable->is_start_codon('CCC'), 0;
-
-ok $myCodonTable->is_ter_codon('UAG');
-ok $myCodonTable->is_ter_codon('TaG');
-ok $myCodonTable->is_ter_codon('TaR');
-ok $myCodonTable->is_ter_codon('tRa');
-is $myCodonTable->is_ter_codon('ttA'), 0;
+ok $myCodonTable->is_start_codon('ATG'), 'is_start_codon, ATG';
+is $myCodonTable->is_start_codon('GGH'), 0, 'is_start_codon, GGH';
+ok $myCodonTable->is_start_codon('HTG'), 'is_start_codon, HTG';
+is $myCodonTable->is_start_codon('CCC'), 0, 'is_start_codon, CCC';
+
+ok $myCodonTable->is_ter_codon('UAG'), 'is_ter_codon, U should map to T, UAG';
+ok $myCodonTable->is_ter_codon('TaG'), 'is_ter_codon,TaG';
+ok $myCodonTable->is_ter_codon('TaR'), 'is_ter_codon,TaR';
+ok $myCodonTable->is_ter_codon('tRa'), 'is_ter_codon,tRa';
+is $myCodonTable->is_ter_codon('ttA'), 0, 'is_ter_codon,ttA';
+
+# Ambiguous codons should fail
+is $myCodonTable->is_ter_codon('NNN'), 0, 'is_ter_codon, ambiguous codons should fail, NNN';
+is $myCodonTable->is_ter_codon('TAN'), 0, 'is_ter_codon, ambiguous codons should fail, TAN';
+is $myCodonTable->is_ter_codon('CC'), 0, 'is_ter_codon, incomplete codons should fail, CC';
 
 ok $myCodonTable->is_unknown_codon('jAG');
 ok $myCodonTable->is_unknown_codon('jg');
diff --git a/t/Tools/Analysis/Protein/ELM.t b/t/Tools/Analysis/Protein/ELM.t
index 1cb53a9..51adc89 100755
--- a/t/Tools/Analysis/Protein/ELM.t
+++ b/t/Tools/Analysis/Protein/ELM.t
@@ -6,7 +6,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests               => 15,
+    test_begin(-tests               => 16,
                -requires_modules    => [qw(IO::String
                                            LWP::UserAgent
                                            HTML::HeadParser
@@ -28,18 +28,26 @@ my $seqio=Bio::SeqIO->new( -verbose => $verbose,
 
 my $seq = $seqio->next_seq();
 ok $tool = Bio::Tools::Analysis::Protein::ELM->new( 
-					-seq=>$seq->primary_seq);
-ok $tool->compartment(['golgi', 'er']);
-ok my $cmp = $tool->compartment();
-is $cmp->[1], 'GO:0005783';
-ok $tool->species(9606);
-is $tool->species, 9606;
-
-ok $tool->run ();
-exit if $tool->status eq 'TERMINATED_BY_ERROR';
-ok my $raw = $tool->result('');
-print $raw if $verbose;
-ok my $parsed = $tool->result('parsed');
-
-is $parsed->{'CLV_NRD_NRD_1'}{'locus'}[0], '54-56';
-ok my @res = $tool->result('Bio::SeqFeatureI');
+					-seq=>$seq->primary_seq), 'new object';
+ok $tool->compartment(['golgi', 'er']), 'set compartment';
+ok my $cmp = $tool->compartment(), 'get compartment';
+is $cmp->[1], 'GO:0005783', 'check compartment';
+ok $tool->species(9606), 'set species()';
+is $tool->species, 9606, 'get species()';;
+
+my $req_status = $tool->run();
+
+ok $req_status, 'run';
+
+is $tool->status(), 'TERMINATED_BY_ERROR';
+
+SKIP: {
+    skip "Bad run() status, possible time out or error so skipping tests", 4 if !$req_status or $tool->status eq 'TERMINATED_BY_ERROR';
+ 
+    ok my $raw = $tool->result('');
+    print $raw if $verbose;
+    ok my $parsed = $tool->result('parsed');
+    
+    is $parsed->{'CLV_NRD_NRD_1'}{'locus'}[0], '54-56';
+    ok my @res = $tool->result('Bio::SeqFeatureI');
+};
diff --git a/t/Tools/rnamotif.t b/t/Tools/rnamotif.t
deleted file mode 100644
index 9c4e0f2..0000000
--- a/t/Tools/rnamotif.t
+++ /dev/null
@@ -1,230 +0,0 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
-use strict;
-
-BEGIN {     
-    use lib '.';
-    use Bio::Root::Test;
-    
-    test_begin(-tests => 0);
-}
-
-my $verbose = test_debug();
-
-### RNAMotif.pm tests ###
-
-my $parser = Bio::Tools::RNAMotif->new(
-		-verbose => $verbose,
-        -file => test_input_file('trna.strict.rnamotif'),
-        -motiftag => 'tRNA_gene',
-        -desctag => 'tRNA');
-
-my @genes;
-while( my $gene = $parser->next_prediction ) {
-    push @genes, $gene;
-}
-
-
-my $val;
-is($genes[1]->display_name, 'tRNA','RNAMotif::display_name()');
-is($genes[12]->seq_id, 'M33910','RNAMotif::seq_id()');
-is($genes[6]->primary_tag, 'tRNA_gene','RNAMotif::primary_tag()');
-is($genes[22]->start, 464,'RNAMotif::start()');
-is($genes[8]->end, 585,'RNAMotif::end()');
-is($genes[9]->strand, 1,'RNAMotif::strand()');
-is(($genes[90]->get_tag_values('sequence'))[0],
-   'cggatt ta ttg ggcg taa a gggct cgtaggc ggctc'.
-   ' gtcgcgtccggtgtgaaagtc catc gcttaac ggtg gatctg cgcc',
-   "RNAMotif::get_tag_values('sequence')");
-is(($genes[90]->get_tag_values('descfile'))[0], 'trna.strict.descr',
-   "RNAMotif::get_tag_values('descfile')");
-is(($genes[4]->get_tag_values('descline'))[0],
-   'gi|173683|gb|M10671|ACSTRW Avian oncornavirus Trp-tRNA',
-   "RNAMotif::get_tag_values('descline')");
-is(($genes[26]->get_tag_values('secstructure'))[0],
-   'h5 ss h5 ss h3 ss h5 ss h3 ss h5 ss h3 h3 ss',
-   "RNAMotif::get_tag_values('secstructure')");
-is($genes[4]->score, '0.000','RNAMotif::score()');
-is($genes[4]->source_tag, 'RNAMotif','RNAMotif::source_tag()');
-
- at genes=();
-
-$parser = Bio::Tools::RNAMotif->new(
-			-verbose => $verbose,
-            -file => test_input_file('sprintf.rnamotif'),
-            -motiftag => 'term',
-            -desctag => 'stem_loop');
-
-while( my $gene = $parser->next_prediction ) {
-    push @genes, $gene;
-}
-
-is($genes[1]->display_name, 'stem_loop','RNAMotif::display_name()');
-is($genes[12]->seq_id, 'M82700','RNAMotif::seq_id()');
-is($genes[6]->primary_tag, 'term','RNAMotif::primary_tag()');
-is($genes[22]->start, 141,'RNAMotif::start()');
-is($genes[8]->end, 154,'RNAMotif::end()');
-is($genes[9]->strand, -1,'RNAMotif::strand()');
-is(($genes[90]->get_tag_values('sequence'))[0], 'ggggaag cttg cttcccc',
-   "RNAMotif::get_tag_values('sequence')");
-is(($genes[84]->get_tag_values('descfile'))[0], 'sprintf.descr',
-   "RNAMotif::get_tag_values('descfile')");
-is(($genes[4]->get_tag_values('descline'))[0],
-   'gi|173741|gb|M83548|AQF16SRRN Aquifex pyrophilus 16S ribosomal RNA (16S rRNA)',
-   "RNAMotif::get_tag_values('descline')");
-is(($genes[26]->get_tag_values('secstructure'))[0], 'h5 ss h3',
-   "RNAMotif::get_Annotations('secstructure')");
-is($genes[4]->score, '-12.100,5,gaaa','RNAMotif::score()');
-is($genes[4]->source_tag, 'RNAMotif','RNAMotif::source_tag()');
-
-### ERPIN.pm tests ###
-
- at genes = ();
-
-my @erpinstats = (
-['30260185','5181155','5181183',1,'CTTT.aacc--.CAACC.CCGTGA.GGTTG.a.GAAG',
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- '1.68e-05'],
-['30260185','3709092','3709121',-1,'CTTT.taatt-.CAGTC.CTGTGA.GACCG.g.AAAG',
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- '5.61e-05'],
-['30260185','3710524','3710553',-1,'TTTT.aaatg-.TAGTC.CTGTGA.GGCTG.c.CAAA',
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- '1.31e-04'],
-['30260185','3711223','3711251',-1,'CTTT.aaca--.CAGCC.CCGTGA.GGTTG.a.GAAG',
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- '4.44e-06']
-);
-
-$parser = Bio::Tools::ERPIN->new(
-			-verbose => $verbose,
-            -file => test_input_file('testfile.erpin'),
-            -motiftag => 'protein_bind',
-			-desctag =>  'pyrR_BL');
-
-while( my $gene = $parser->next_prediction ) {
-	my @stats = @{ shift @erpinstats };
-	is($gene->display_name, 'pyrR_BL','ERPIN::display_name()');
-	is($gene->seq_id, shift @stats,'ERPIN::seq_id()');
-	is($gene->primary_tag, 'protein_bind','ERPIN::primary_tag()');
-	is($gene->start, shift @stats,'ERPIN::start()');
-	is($gene->end, shift @stats,'ERPIN::end()');
-	is($gene->strand, shift @stats,'ERPIN::strand()');
-	($val) = $gene->get_tag_values('sequence');
-	is($val, shift @stats, "ERPIN::get_tag_values('sequence')");
-	eval {($val) = $gene->get_tag_values('descfile')}; # no descfile
-	like($@, qr(asking for tag value that does not exist descfile));
-	($val) = $gene->get_tag_values('descline'); 
-	is($val, shift @stats, "ERPIN::get_tag_values('descline')");
-	eval {($val) = $gene->get_tag_values('secstructure')}; # no secstructure 
-	like($@, qr(asking for tag value that does not exist secstructure));
-	is($gene->score, shift @stats,'ERPIN::score()');
-	is($gene->source_tag, 'ERPIN','ERPIN::source_tag()');
-}
-
-### Infernal.pm tests ###
-
-my @stats = (
-['30260185','5181155','5181183',1,'CTTT.aacc--.CAACC.CCGTGA.GGTTG.a.GAAG',0,
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- 0,'1.68e-05'],
-['30260185','3709092','3709121',-1,'CTTT.taatt-.CAGTC.CTGTGA.GACCG.g.AAAG',0,
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- 0,'5.61e-05'],
-['30260185','3710524','3710553',-1,'TTTT.aaatg-.TAGTC.CTGTGA.GGCTG.c.CAAA',0,
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- 0,'1.31e-04'],
-['30260185','3711223','3711251',-1,'CTTT.aaca--.CAGCC.CCGTGA.GGTTG.a.GAAG',0,
- 'gi|30260185|gb|AE016879.1| Bacillus anthracis str. Ames, complete genome',
- 0,'4.44e-06']
-);
-
-$parser = Bio::Tools::Infernal->new(
-            -file => test_input_file('test.infernal'),
-            -motiftag => 'misc_binding',
-            -desctag => 'Purine riboswitch',
-            -cm    => 'Purine',
-            -rfam  =>  'RF00167',
-            -minscore => 20);
-
-my $gene = $parser->next_prediction;
-# get query (model) data
-is($gene->display_name, 'Purine riboswitch','Infernal::display_name()');
-is($gene->seq_id, 'RF00167','Infernal::seq_id()');
-is($gene->primary_tag, 'misc_binding','Infernal::primary_tag()');
-is($gene->source_tag, 'Infernal 0.71','Infernal::source_tag()');
-is($gene->start, '1','Infernal::start()');
-is($gene->end, '102','Infernal::end()');
-is($gene->strand, '0','Infernal::strand()');
-is($gene->score, '78.40','Infernal::strand()');
-# get hit data
-$gene->invert;
-is($gene->display_name, 'Purine riboswitch','Infernal::display_name()');
-is($gene->seq_id, '2239287','Infernal::seq_id()');
-is($gene->primary_tag, 'misc_binding','Infernal::primary_tag()');
-is($gene->source_tag, 'Infernal 0.71','Infernal::source_tag()');
-is($gene->start, '15589','Infernal::start()');
-is($gene->end, '15691','Infernal::end()');
-is($gene->strand, '1','Infernal::strand()');
-is($gene->score, '78.40','Infernal::strand()');
-($val) = $gene->get_tag_values('model');
-is($val,
-   'aAaaauaaAaaaaaaaauaCuCgUAUAaucucgggAAUAUGGcccgagaGUuUCUACCaGgcaaCCGUAAAuugcCuGACUAcG.aGuaAauauuaaauauuu',
-   "Infernal::get_tag_values('model')");
-($val) = $gene->get_tag_values('midline');
-is($val,
-   ' A+ A+A+ AAAA A   :CUC:UAUAAU: :GGGAAUAUGGCCC: :AGUUUCUACC:GGCAACCGUAAAUUGCC:GACUA:G AG: AA + ++  +++++',
-   "Infernal::get_tag_values('midline')");
-($val) = $gene->get_tag_values('hit');
-is($val,
-   'CAUGAAAUCAAAACACGACCUCAUAUAAUCUUGGGAAUAUGGCCCAUAAGUUUCUACCCGGCAACCGUAAAUUGCCGGACUAUGcAGGGAAGUGAUCGAUAAA',
-   "Infernal::get_tag_values('hit')");
-($val) = $gene->get_tag_values('secstructure');
-is($val,
-   ':::::::::::::::::((((((((,,,<<<<<<<_______>>>>>>>,,,,,,,,<<<<<<<_______>>>>>>>,,)))).))))::::::::::::::',
-   "Infernal::get_tag_values('secstructure')");
-($val) = $gene->get_tag_values('seq_name'),
-is($val, 'gi|2239287|gb|U51115.1|BSU51115',
-   "Infernal::get_tag_values('seq_name')");
-
-$gene = $parser->next_prediction;
-# get query (model) data
-is($gene->display_name, 'Purine riboswitch','Infernal::display_name()');
-is($gene->seq_id, 'RF00167','Infernal::seq_id()');
-is($gene->primary_tag, 'misc_binding','Infernal::primary_tag()');
-is($gene->source_tag, 'Infernal 0.71','Infernal::source_tag()');
-is($gene->start, '1','Infernal::start()');
-is($gene->end, '102','Infernal::end()');
-is($gene->strand, '0','Infernal::strand()');
-is($gene->score, '81.29','Infernal::strand()');
-
-$gene->invert; # switch to get hit data
-is($gene->display_name, 'Purine riboswitch','Infernal::display_name()');
-is($gene->seq_id, '2239287','Infernal::seq_id()');
-is($gene->primary_tag, 'misc_binding','Infernal::primary_tag()');
-is($gene->source_tag, 'Infernal 0.71','Infernal::source_tag()');
-is($gene->start, '11655','Infernal::start()');
-is($gene->end, '11756','Infernal::end()');
-is($gene->strand, '1','Infernal::strand()');
-is($gene->score, '81.29','Infernal::strand()');
-($val) = $gene->get_tag_values('model');
-is($val,
-   'aAaaauaaAaaaaaaaauaCuCgUAUAaucucgggAAUAUGGcccgagaGUuUCUACCaGgcaaCCGUAAAuugcCuGACUAcGaGuaAauauuaaauauuu',
-   "Infernal::get_tag_values('model')");
-($val) = $gene->get_tag_values('midline');
-is($val,
-   'A AAAU AAA+AA A+   : CGUAUAAU::CG:GAAUAUGGC:CG::AGU UCUACCA:GC ACCGUAAAU GC:UGACUACG :   AU+U +++  UUU',
-   "Infernal::get_tag_values('midline')");
-($val) = $gene->get_tag_values('hit');
-is($val,
-   'AGAAAUCAAAUAAGAUGAAUUCGUAUAAUCGCGGGAAUAUGGCUCGCAAGUCUCUACCAAGCUACCGUAAAUGGCUUGACUACGUAAACAUUUCUUUCGUUU',
-   "Infernal::get_tag_values('hit')");
-($val) = $gene->get_tag_values('secstructure');
-is($val,
-   ':::::::::::::::::((((((((,,,<<<<<<<_______>>>>>>>,,,,,,,,<<<<<<<_______>>>>>>>,,))))))))::::::::::::::',
-   "Infernal::get_tag_values('secstructure')");
-($val) = $gene->get_tag_values('seq_name');
-is($val,
-   'gi|2239287|gb|U51115.1|BSU51115',
-   "Infernal::get_tag_values('seq_name')");
diff --git a/t/data/EG352462.gbxml b/t/data/EG352462.gbxml
index c4ad3b9..440d360 100644
--- a/t/data/EG352462.gbxml
+++ b/t/data/EG352462.gbxml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE GBSet PUBLIC "-//NCBI//NCBI GBSeq/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_GBSeq.dtd">
+<!DOCTYPE GBSet PUBLIC "-//NCBI//NCBI GBSeq/EN" "https://www.ncbi.nlm.nih.gov/dtd/NCBI_GBSeq.dtd">
 <GBSet>
 <GBSeq>
   <GBSeq_locus>EG352462</GBSeq_locus>
diff --git a/t/data/dbfa/mixed_alphabet.fasta b/t/data/dbfa/mixed_alphabet.fasta
index a0f76f7..28b3010 100644
--- a/t/data/dbfa/mixed_alphabet.fasta
+++ b/t/data/dbfa/mixed_alphabet.fasta
@@ -22,5 +22,17 @@ FSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANA
 LAHKYHKERADLPTLGFTHFQPAQLTTVGKRCCLWIQDLCMDLQNLKRVRDELRFRGVKGTTGTQASFLQ
 LFEGDHQKVEQLDKMVTEKAGFKRAYIITGQTYTRKVDIEVLSVLASLGASVHKICTDIRLLANLKEMEE
 
+>0
+MHLTPEEKSAVTALWGKVNVDEVGGEALGRLLVVYPETQRFFESFGDLSTPDAVMGNPKVKAHGKKVLGA
+FSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANA
+LAHKYHKERADLPTLGFTHFQPAQLTTVGKRCCLWIQDLCMDLQNLKRVRDELRFRGVKGTTGTQASFLQ
+LFEGDHQKVEQLDKMVTEKAGFKRAYIITGQTYTRKVDIEVLSVLASLGASVHKICTDIRLLANLKEMEE
+
+>1
+MHLTPEEKSAVTALWGKVNVDEVGGEALGRLLVVYPETQRFFESFGDLSTPDAVMGNPKVKAHGKKVLGA
+FSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANA
+LAHKYHKERADLPTLGFTHFQPAQLTTVGKRCCLWIQDLCMDLQNLKRVRDELRFRGVKGTTGTQASFLQ
+LFEGDHQKVEQLDKMVTEKAGFKRAYIITGQTYTRKVDIEVLSVLASLGASVHKICTDIRLLANLKEMEE
+
 >123 empty sequence
 
diff --git a/t/data/fastq/RT98876.fastq b/t/data/fastq/RT98876.fastq
new file mode 100644
index 0000000..46e7f78
--- /dev/null
+++ b/t/data/fastq/RT98876.fastq
@@ -0,0 +1,4 @@
+ at Illumina_SRR125365.38 s_5_1_0001_qseq_37 length=76
+CCGCCATTTCTTCAAATCTTTTCTTTTCTTTAGGAGTCATCAATTTCCATTTCTCTGCACATTTCTTTGAAAATTA
++Illumina_SRR125365.38 s_5_1_0001_qseq_37 length=76
+ at CCCCCCCCBCCCCCCCCCCCAACCCCCCCCC?CCCCCCCCCCCCCAACCCCCCCCCCCCCCCCCCCCB??<BC>#
\ No newline at end of file
diff --git a/t/data/so.obo b/t/data/so.obo
index 18b4c90..9568058 100644
--- a/t/data/so.obo
+++ b/t/data/so.obo
@@ -906,7 +906,7 @@ relationship: part_of SO:0000764 ! BAC_clone
 [Term]
 id: SO:0000154
 name: PAC
-def: "P1 Artificial Chromosome. These vectors can hold large inserts, typically 80-200 kb, and propagate in E. coli as a single copy episome." [http://www.ncbi.nlm.nih.gov/genome/guide/mouse/glossary.htm]
+def: "P1 Artificial Chromosome. These vectors can hold large inserts, typically 80-200 kb, and propagate in E. coli as a single copy episome." [https://www.ncbi.nlm.nih.gov/genome/guide/mouse/glossary.htm]
 synonym: "P1" RELATED []
 is_a: SO:0000440 ! vector
 relationship: part_of SO:0000762 ! PAC_clone
@@ -1997,7 +1997,7 @@ is_a: SO:0000209 ! rRNA_primary_transcript
 [Term]
 id: SO:0000326
 name: SAGE_tag
-def: "A short diagnostic sequence tag, serial analysis of gene expression (SAGE), that allows the quantitative and simultaneous analysis of a large number of transcripts." [http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=7570003&dopt=Abstract]
+def: "A short diagnostic sequence tag, serial analysis of gene expression (SAGE), that allows the quantitative and simultaneous analysis of a large number of transcripts." [https://www.ncbi.nlm.nih.gov/pubmed/7570003]
 subset: SOFA
 is_a: SO:0000324 ! tag
 
@@ -2454,7 +2454,7 @@ is_a: SO:0000274 ! snRNA
 [Term]
 id: SO:0000397
 name: U6atac_snRNA
-def: "U6atac_snRNA -An snRNA required for the splicing of the minor U12-dependent class of eukaryotic nuclear introns. It forms a base paired complex with U4atac_snRNA (SO:0000394)." [http:http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=retrieve&db=pubmed&list_uids=1 2409455&dopt=Abstract]
+def: "U6atac_snRNA -An snRNA required for the splicing of the minor U12-dependent class of eukaryotic nuclear introns. It forms a base paired complex with U4atac_snRNA (SO:0000394)." [https://www.ncbi.nlm.nih.gov/pubmed/12409455]
 subset: SOFA
 is_a: SO:0000274 ! snRNA
 
@@ -3833,13 +3833,13 @@ is_a: SO:0000655 ! ncRNA
 [Term]
 id: SO:0000591
 name: pseudoknot
-def: "A stem-loop RNA structure where nucleotides in the loop participate in complementary interactions with a region of RNA downstream of the stem-loop." [http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=12519954&dopt=Abstract]
+def: "A stem-loop RNA structure where nucleotides in the loop participate in complementary interactions with a region of RNA downstream of the stem-loop." [https://www.ncbi.nlm.nih.gov/pubmed/12519954]
 is_a: SO:0000002 ! sequence_secondary_structure
 
 [Term]
 id: SO:0000592
 name: H_pseudoknot
-def: "A pseudoknot which contains two stems and at least two loops." [http://www.ncbi.nlm.nih.gov 80/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=10334330&dopt=Abstract]
+def: "A pseudoknot which contains two stems and at least two loops." [https://www.ncbi.nlm.nih.gov/pubmed/10334330]
 synonym: "H-pseudoknot" RELATED []
 is_a: SO:0000591 ! pseudoknot
 
@@ -4414,7 +4414,7 @@ is_obsolete: true
 [Term]
 id: SO:0000683
 name: exonic_splice_enhancer
-def: "Exonic splicing enhancers (ESEs) facilitate exon definition by assisting in the recruitment of splicing factors to the adjacent intron." [http://www.ncbi.nlm.nih.gov 80/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=12403462&dopt=Abstract]
+def: "Exonic splicing enhancers (ESEs) facilitate exon definition by assisting in the recruitment of splicing factors to the adjacent intron." [https://www.ncbi.nlm.nih.gov/pubmed/12403462]
 is_a: SO:0000344 ! splice_enhancer
 
 [Term]
@@ -6182,7 +6182,7 @@ is_a: SO:1001268 ! recoding_stimulatory_region
 [Term]
 id: SO:1001261
 name: recoded_mRNA
-def: "A gene coding an mRNA which is recoded before translation, usually by special cis-acting signals." [http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=8811194&dopt=Abstract]
+def: "A gene coding an mRNA which is recoded before translation, usually by special cis-acting signals." [https://www.ncbi.nlm.nih.gov/pubmed/8811194]
 is_a: SO:0000115 ! transcript_feature
 
 [Term]
@@ -6198,7 +6198,7 @@ is_a: SO:0000118 ! transcript_with_translational_frameshift
 [Term]
 id: SO:1001264
 name: mRNA_recoded_by_translational_bypass
-def: "A gene whose mRNA is translated by ribosomes that suspend translation at a particular codon and resume translation at a particular non-overlapping downstream codon." [http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=8811194&dopt=Abstract]
+def: "A gene whose mRNA is translated by ribosomes that suspend translation at a particular codon and resume translation at a particular non-overlapping downstream codon." [https://www.ncbi.nlm.nih.gov/pubmed/8811194]
 is_a: SO:1001261 ! recoded_mRNA
 
 [Term]
@@ -6220,7 +6220,7 @@ is_a: SO:1001265 ! mRNA_recoded_by_codon_redefinition
 [Term]
 id: SO:1001268
 name: recoding_stimulatory_region
-def: "A site in an mRNA sequence that stimulates the recoding of the same mRNA." [http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=12519954&dopt=Abstract]
+def: "A site in an mRNA sequence that stimulates the recoding of the same mRNA." [https://www.ncbi.nlm.nih.gov/pubmed/12519954]
 synonym: "recoding_stimulatory_signal" RELATED []
 relationship: part_of SO:0000234 ! mRNA
 
@@ -6319,7 +6319,7 @@ is_a: SO:1001277 ! three_prime_recoding_site
 [Term]
 id: SO:1001287
 name: distant_three_prime_recoding_signal
-def: "A recoding signal that is found many hundreds of nucleotides 3' of a redefined stop codon." [http://www.ncbi.nlm.nih.gov 80/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=8709208&dopt=Abstract]
+def: "A recoding signal that is found many hundreds of nucleotides 3' of a redefined stop codon." [https://www.ncbi.nlm.nih.gov/pubmed/8709208]
 is_a: SO:1001277 ! three_prime_recoding_site
 
 [Term]
diff --git a/t/data/test.locuslink b/t/data/test.locuslink
index b52a0f3..4973ad5 100644
--- a/t/data/test.locuslink
+++ b/t/data/test.locuslink
@@ -43,15 +43,15 @@ ALIAS_PROT: diamine oxidase
 ALIAS_PROT: Amiloride-binding protein-1
 UNIGENE: Hs.75741
 BUTTON: unigene.gif
-LINK: http://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=75741
+LINK: https://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=75741
 OMIM: 104610
 ECNUM: 1.4.3.6
 MAP: 7q34-q36|RefSeq|C|
 MAPLINK: default_human_gene|ABP1
 BUTTON: snp.gif
-LINK: http://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?locusId=26
+LINK: https://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?locusId=26
 BUTTON: homol.gif
-LINK: http://www.ncbi.nlm.nih.gov/HomoloGene/homolquery.cgi?TEXT=26[loc]&TAXID=9606
+LINK: https://www.ncbi.nlm.nih.gov/HomoloGene/homolquery.cgi?TEXT=26[loc]&TAXID=9606
 BUTTON: gdb.gif
 LINK: http://gdbwww.gdb.org/gdb-bin/genera/accno?GDB:127105
 BUTTON: ensembl.gif
@@ -135,7 +135,7 @@ ALIAS_PROT: arg
 ALIAS_PROT: Abelson murine leukemia viral (v-abl) oncogene homolog 2 (arg,
 UNIGENE: Hs.121521
 BUTTON: unigene.gif
-LINK: http://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=121521
+LINK: https://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=121521
 OMIM: 164690
 ECNUM: 2.7.1.112
 MAP: 1q24-q25|<a href="http://gdbwww.gdb.org/gdb-bin/genera/accno?GDB:119641">HUGO</a>|C|
@@ -143,9 +143,9 @@ MAPLINK: default_human_gene|ABL2
 PHENOTYPE: Leukemia, acute myeloid, with eosinophilia
 PHENOTYPE_ID: 164690
 BUTTON: snp.gif
-LINK: http://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?locusId=27
+LINK: https://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?locusId=27
 BUTTON: homol.gif
-LINK: http://www.ncbi.nlm.nih.gov/HomoloGene/homolquery.cgi?TEXT=27[loc]&TAXID=9606
+LINK: https://www.ncbi.nlm.nih.gov/HomoloGene/homolquery.cgi?TEXT=27[loc]&TAXID=9606
 BUTTON: gdb.gif
 LINK: http://gdbwww.gdb.org/gdb-bin/genera/accno?GDB:119641
 BUTTON: ensembl.gif
diff --git a/t/data/test.tseq b/t/data/test.tseq
index 88a513a..b9df805 100644
--- a/t/data/test.tseq
+++ b/t/data/test.tseq
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE TSeqSet PUBLIC "-//NCBI//NCBI TSeq/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd">
+<!DOCTYPE TSeqSet PUBLIC "-//NCBI//NCBI TSeq/EN" "https://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd">
 <TSeqSet>
 <TSeq>
   <TSeq_seqtype value="nucleotide"/>
diff --git a/travis_scripts/trigger-dockerhub.sh b/travis_scripts/trigger-dockerhub.sh
new file mode 100755
index 0000000..3674fa4
--- /dev/null
+++ b/travis_scripts/trigger-dockerhub.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+set -e
+
+# the Docker Hub API endpoint
+dockerapi="https://registry.hub.docker.com/u/bioperl/bioperl/trigger"
+
+## Travis runs a build for several versions of Perl, but we want to
+## trigger only for the same version of Perl as is running in the
+## Docker container
+docker_perl="5.18"
+
+if [[ ${TRAVIS_PERL_VERSION:0:4} != "$docker_perl" ]] ; then
+    echo "Triggering Docker Hub only for Perl $docker_perl, not $TRAVIS_PERL_VERSION"
+    exit 0
+fi
+
+if [[ "$TRAVIS_PULL_REQUEST" != "false" ]] ; then
+    echo "Not triggering Docker Hub for pull requests."
+    exit 0
+fi
+
+if [[ -z "$DOCKERHUB_TOKEN" ]] ; then
+    echo "No API token for Docker Hub, add to repository settings."
+    exit 1
+fi
+
+## Should check for tag names that indicate release candidates rather
+## than release names, and then skip those.
+## However, this is already taken care of by the regular expression
+## for whitelisting branches.
+
+if [[ -n "$TRAVIS_TAG" && "$TRAVIS_TAG" != "false" ]] ; then
+    # if we are building a whitelisted tag, we trigger the stable image
+    echo "Triggering rebuild of Docker image bioperl/bioperl:stable"
+    curl -H "Content-Type: application/json" \
+         --data '{"docker_tag": "stable"}' \
+         -X POST $dockerapi/$DOCKERHUB_TOKEN/
+elif [[ "$TRAVIS_BRANCH" != "master" ]] ; then
+    # if someone were to create a branch that matches the whitelisting
+    # pattern, we skip that here, and only trigger on master
+    echo "Not triggering Docker Hub for branches other than master"
+else
+    # not a pull request, not a tag, and the branch is master
+    echo "Triggering rebuild of Docker image bioperl/bioperl:latest"
+    curl -H "Content-Type: application/json" \
+         --data '{"docker_tag": "latest"}' \
+         -X POST $dockerapi/$DOCKERHUB_TOKEN/
+fi

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/bioperl.git



More information about the debian-med-commit mailing list