unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Jan Malakhovski <oxij@oxij.org>
To: notmuch@notmuchmail.org
Subject: [PATCH] python: fix get_filenames() and make it actually usable
Date: Fri, 31 Jul 2015 01:36:26 +0000	[thread overview]
Message-ID: <1438306586-7597-1-git-send-email-oxij@oxij.org> (raw)

The problem with the previous implementation is that different
versions of python exhaust __iter__() differently and the
implementation that can be exhausted is not only absolutely unusable
in the user code, but it also can not be consistently used with both
python 2.* and 3.*.

This doesn't change the interface.
---
 bindings/python/notmuch/filenames.py | 84 +++++++++++-------------------------
 1 file changed, 26 insertions(+), 58 deletions(-)

diff --git a/bindings/python/notmuch/filenames.py b/bindings/python/notmuch/filenames.py
index 229f414..e2b8886 100644
--- a/bindings/python/notmuch/filenames.py
+++ b/bindings/python/notmuch/filenames.py
@@ -65,6 +65,18 @@ class Filenames(Python3StringMixIn):
     _get.argtypes = [NotmuchFilenamesP]
     _get.restype = c_char_p
 
+    _valid = nmlib.notmuch_filenames_valid
+    _valid.argtypes = [NotmuchFilenamesP]
+    _valid.restype = bool
+
+    _move_to_next = nmlib.notmuch_filenames_move_to_next
+    _move_to_next.argtypes = [NotmuchFilenamesP]
+    _move_to_next.restype = None
+
+    _destroy = nmlib.notmuch_filenames_destroy
+    _destroy.argtypes = [NotmuchFilenamesP]
+    _destroy.restype = None
+
     def __init__(self, files_p, parent):
         """
         :param files_p: A pointer to an underlying *notmuch_tags_t*
@@ -83,68 +95,24 @@ class Filenames(Python3StringMixIn):
         if not files_p:
             raise NullPointerError()
 
-        self._files_p = files_p
+        self._list = []
+        while self._valid(files_p):
+            file_ = self._get(files_p)
+            self._move_to_next(files_p)
+            self._list.append(file_.decode('utf-8', 'ignore'))
+        self._destroy(files_p)
+
         #save reference to parent object so we keep it alive
         self._parent = parent
 
     def __iter__(self):
-        """ Make Filenames an iterator """
-        return self
-
-    _valid = nmlib.notmuch_filenames_valid
-    _valid.argtypes = [NotmuchFilenamesP]
-    _valid.restype = bool
-
-    _move_to_next = nmlib.notmuch_filenames_move_to_next
-    _move_to_next.argtypes = [NotmuchFilenamesP]
-    _move_to_next.restype = None
-
-    def __next__(self):
-        if not self._files_p:
-            raise NotInitializedError()
-
-        if not self._valid(self._files_p):
-            self._files_p = None
-            raise StopIteration
-
-        file_ = Filenames._get(self._files_p)
-        self._move_to_next(self._files_p)
-        return file_.decode('utf-8', 'ignore')
-    next = __next__ # python2.x iterator protocol compatibility
-
-    def __unicode__(self):
-        """Represent Filenames() as newline-separated list of full paths
-
-        .. note::
-
-            This method exhausts the iterator object, so you will not be able to
-            iterate over them again.
-        """
-        return "\n".join(self)
-
-    _destroy = nmlib.notmuch_filenames_destroy
-    _destroy.argtypes = [NotmuchMessageP]
-    _destroy.restype = None
-
-    def __del__(self):
-        """Close and free the notmuch filenames"""
-        if self._files_p:
-            self._destroy(self._files_p)
+        """Make Filenames an iterator"""
+        return self._list.__iter__()
 
     def __len__(self):
-        """len(:class:`Filenames`) returns the number of contained files
+        """len(:class:`Filenames`) returns the number of contained files"""
+        return self._list.__len__()
 
-        .. note::
-
-            This method exhausts the iterator object, so you will not be able to
-            iterate over them again.
-        """
-        if not self._files_p:
-            raise NotInitializedError()
-
-        i = 0
-        while self._valid(self._files_p):
-            self._move_to_next(self._files_p)
-            i += 1
-        self._files_p = None
-        return i
+    def __unicode__(self):
+        """Represent Filenames() as newline-separated list of full paths"""
+        return "\n".join(self)
-- 
2.4.1

             reply	other threads:[~2015-07-31  1:44 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-31  1:36 Jan Malakhovski [this message]
2015-07-31  9:42 ` [PATCH] python: fix get_filenames() and make it actually usable Tomi Ollila

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1438306586-7597-1-git-send-email-oxij@oxij.org \
    --to=oxij@oxij.org \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).