]> git.ipfire.org Git - pakfire.git/commitdiff
ui.progressbar: Support python context
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Nov 2016 16:38:52 +0000 (17:38 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Nov 2016 16:38:52 +0000 (17:38 +0100)
This patch allows us to use the progressbar inside a with
statement which makes code shorter and sweeter and we need
to take care less about the progressbar implementation where
ever we are using it.

e.g.:
p = ProgressBar()
...

with p:
do something
p.update(i)

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/http.py
src/pakfire/ui/progressbar.py

index 2fc1195c1ec4270a072a389e4ed046c4588c28a4..a619900cd4e8322bfb11d185a65630dd9f702240 100644 (file)
@@ -182,7 +182,7 @@ class Client(object):
 
                raise MaxTriesExceededError
 
-       def retrieve(self, url, filename, show_progress=True, message=None, **kwargs):
+       def retrieve(self, url, filename, message=None, **kwargs):
                p = None
 
                if message is None:
@@ -190,31 +190,24 @@ class Client(object):
 
                buffer_size = 100 * 1024 # 100k
 
-               # Make a progressbar
-               if show_progress:
-                       p = self._make_progressbar(message)
-
                # Prepare HTTP request
                r = self._make_request(url, **kwargs)
 
                # Send the request
-               with self._send_request(r) as f:
-                       # Try setting progress bar to correct maximum value
-                       # XXX this might need a function in ProgressBar
-                       l = self._get_content_length(f)
-                       if p:
+               with self._make_progressbar(message) as p:
+                       with self._send_request(r) as f:
+                               # Try setting progress bar to correct maximum value
+                               # XXX this might need a function in ProgressBar
+                               l = self._get_content_length(f)
                                p.value_max = l
 
-                       buf = f.read(buffer_size)
-                       while buf:
-                               l = len(buf)
-                               if p:
-                                       p.update_increment(l)
+                               while True:
+                                       buf = f.read(buffer_size)
+                                       if not buf:
+                                               break
 
-                               buf = f.read(buffer_size)
-
-               if p:
-                       p.finish()
+                                       l = len(buf)
+                                       p.update_increment(l)
 
        def _get_content_length(self, response):
                s = response.getheader("Content-Length")
@@ -244,8 +237,8 @@ class Client(object):
 
                return "Basic %s" % authstring.decode("ascii")
 
-       def _make_progressbar(self, message=None):
-               p = progressbar.ProgressBar()
+       def _make_progressbar(self, message=None, **kwargs):
+               p = progressbar.ProgressBar(**kwargs)
 
                # Show message (e.g. filename)
                if message:
@@ -277,7 +270,7 @@ class Client(object):
                w = progressbar.WidgetETA()
                p.add(w)
 
-               return p.start()
+               return p
 
 
 class HTTPError(errors.Error):
index afba9adbc9da94a36a117fcc746cae511f38e2ae..ecb241524305ee0d6dd489e03bf3e883e58d6af6 100644 (file)
@@ -178,6 +178,17 @@ class ProgressBar(object):
 
                return 0
 
+       # Implement using progressbar as context
+
+       def __enter__(self):
+               # Start the progressbar
+               self.start()
+
+               return self
+
+       def __exit__(self, type, value, traceback):
+               self.finish()
+
 
 def format_updatable(widget, pbar):
        if hasattr(widget, "update"):