From 2fe37e7c46671a2ba9039f20c63930de2aaa0576 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sun, 8 Nov 2015 17:59:33 +0100
Subject: [PATCH] Fix bug with exception never handled in once_at_a_time
 coroutines

---
 src/cutecoin/tools/decorators.py | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/cutecoin/tools/decorators.py b/src/cutecoin/tools/decorators.py
index 3842dbd4..169bdae1 100644
--- a/src/cutecoin/tools/decorators.py
+++ b/src/cutecoin/tools/decorators.py
@@ -13,15 +13,24 @@ def cancel_once_task(object, fn):
 def once_at_a_time(fn):
     @functools.wraps(fn)
     def wrapper(*args, **kwargs):
+        def task_done(task):
+            try:
+                args[0].__tasks.pop(fn.__name__)
+            except KeyError:
+                logging.debug("Task already removed")
+
         if getattr(args[0], "__tasks", None) is None:
             setattr(args[0], "__tasks", {})
         if fn.__name__ in args[0].__tasks:
             if not args[0].__tasks[fn.__name__].done():
                 args[0].__tasks[fn.__name__].cancel()
+
         try:
             args[0].__tasks[fn.__name__] = fn(*args, **kwargs)
+            args[0].__tasks[fn.__name__].add_done_callback(task_done)
         except asyncio.CancelledError:
             logging.debug("Cancelled asyncified : {0}".format(fn.__name__))
+
         return args[0].__tasks[fn.__name__]
     return wrapper
 
-- 
GitLab