Blob Blame History Raw
From 1d4c4a16c49d95d3c52e77c1e62c687ec64b284d Mon Sep 17 00:00:00 2001
From: peterjc <p.j.a.cock@googlemail.com>
Date: Thu, 21 Jun 2018 14:29:31 +0100
Subject: [PATCH 1/3] Avoid leaking StopIteration in Bio/bgzf.py

Still using this as an internal end-of-file, thus
end-of-iteration signal, which is perhaps not ideal.

See https://www.python.org/dev/peps/pep-0479/
---
 Bio/bgzf.py | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/Bio/bgzf.py b/Bio/bgzf.py
index efa6262afa..e539ec4905 100755
--- a/Bio/bgzf.py
+++ b/Bio/bgzf.py
@@ -391,18 +391,25 @@ def BgzfBlocks(handle):
     data_start = 0
     while True:
         start_offset = handle.tell()
-        # This may raise StopIteration which is perfect here
-        block_length, data = _load_bgzf_block(handle)
+        try:
+            block_length, data = _load_bgzf_block(handle)
+        except StopIteration:
+            break
         data_len = len(data)
         yield start_offset, block_length, data_start, data_len
         data_start += data_len
 
 
 def _load_bgzf_block(handle, text_mode=False):
-    """Load the next BGZF block of compressed data (PRIVATE)."""
+    """Load the next BGZF block of compressed data (PRIVATE).
+
+    Returns a tuple (block size and data), or at end of file
+    will raise StopIteration.
+    """
     magic = handle.read(4)
     if not magic:
-        # End of file
+        # End of file - should we signal this differently now?
+        # See https://www.python.org/dev/peps/pep-0479/
         raise StopIteration
     if magic != _bgzf_magic:
         raise ValueError(r"A BGZF (e.g. a BAM file) block should start with "

From 0694c396ef7988e3c032d27e86fb131257812687 Mon Sep 17 00:00:00 2001
From: peterjc <p.j.a.cock@googlemail.com>
Date: Thu, 21 Jun 2018 16:12:14 +0100
Subject: [PATCH 2/3] Return None in generator functions, not StopIteration

See https://www.python.org/dev/peps/pep-0479/
---
 Bio/TogoWS/__init__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Bio/TogoWS/__init__.py b/Bio/TogoWS/__init__.py
index 4018244bcf..3cf5309c8a 100644
--- a/Bio/TogoWS/__init__.py
+++ b/Bio/TogoWS/__init__.py
@@ -199,7 +199,7 @@ def search_iter(db, query, limit=None, batch=100):
     """
     count = search_count(db, query)
     if not count:
-        raise StopIteration
+        return
     # NOTE - We leave it to TogoWS to enforce any upper bound on each
     # batch, they currently return an HTTP 400 Bad Request if above 100.
     remain = count

From 86eb2275448da22aa6976c6c7c46f9779af95cf1 Mon Sep 17 00:00:00 2001
From: peterjc <p.j.a.cock@googlemail.com>
Date: Thu, 21 Jun 2018 16:22:51 +0100
Subject: [PATCH 3/3] Fix Nexus StopIteration error under Python 3.7.0rc1

Reported as Biopython GitHub issue #1693 via Fedora
packaging work for Python 3.7.

The StopIteration from the Nexus comment parsing could
propogate up to AlignIO and cause a failure there too.
See:

https://github.com/biopython/biopython/issues/1693

This is in some way triggered by the changes for PEP479,
where inappropriate StopIteration exceptions get turned
into RuntimeError exceptions instead, see:

https://www.python.org/dev/peps/pep-0479/
---
 Bio/Nexus/Nexus.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Bio/Nexus/Nexus.py b/Bio/Nexus/Nexus.py
index 18b0a9f9c7..6faf95e569 100644
--- a/Bio/Nexus/Nexus.py
+++ b/Bio/Nexus/Nexus.py
@@ -444,6 +444,8 @@ def _kill_comments_and_break_lines(text):
 
     NOTE: this function is very slow for large files, and obsolete when using C extension cnexus
     """
+    if not text:
+        return ""
     contents = iter(text)
     newtext = []
     newline = []