Skip to content

Commit

Permalink
Merge de8ceed into adc6d2f
Browse files Browse the repository at this point in the history
  • Loading branch information
amosonn committed Dec 16, 2015
2 parents adc6d2f + de8ceed commit 9f3e586
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 5 deletions.
6 changes: 6 additions & 0 deletions frogress/__init__.py
Expand Up @@ -3,6 +3,8 @@
"""
from .bars import Bar
from .bars import TransferBar
from .bars import WatchBar
from .bars import TransferWatchBar
from .api import bar
from .utils import get_iterable_size
from .utils import get_file_info
Expand All @@ -14,11 +16,14 @@
from .widgets import BarWidget
from .widgets import TimerWidget
from .widgets import WhirlWidget
from .widgets import WatchLenWidget


__all__ = [
'Bar',
'TransferBar',
'WatchBar',
'TransferWatchBar',
'Widget',
'EtaWidget',
'PercentageWidget',
Expand All @@ -27,6 +32,7 @@
'BarWidget',
'TimerWidget',
'WhirlWidget',
'WatchLenWidget',
'get_file_info',
'get_iterable_size',
'bar',
Expand Down
15 changes: 13 additions & 2 deletions frogress/api.py
@@ -1,19 +1,30 @@
from .bars import Bar
from .bars import TransferBar
from .bars import WatchBar
from .bars import TransferWatchBar
from .utils import get_iterable_size
from .utils import get_file_info


def bar(iterable, **kwargs):
bar_cls = Bar
kwargs.setdefault('steps', get_iterable_size(iterable))


is_watching = 'watch' in kwargs
print(kwargs, is_watching)

source = kwargs.pop('source', iterable)
file_info = get_file_info(source)

if file_info:
kwargs['steps'] = file_info['size']
kwargs['step_callback'] = file_info['step_callback']
bar_cls = TransferBar
if is_watching:
bar_cls = TransferWatchBar
else:
bar_cls = TransferBar
elif is_watching:
bar_cls = WatchBar

progressbar = bar_cls(iterable, **kwargs)
return progressbar
Expand Down
9 changes: 8 additions & 1 deletion frogress/bars.py
Expand Up @@ -7,6 +7,7 @@
from .widgets import TimerWidget
from .widgets import TransferWidget
from .widgets import PercentageWidget
from .widgets import WatchLenWidget
import datetime
import sys
import time
Expand All @@ -16,11 +17,12 @@ class Bar(object):

DEFAULT_WIDGETS = [BarWidget, ProgressWidget, TimerWidget, EtaWidget]

def __init__(self, iterable, steps=None, step_callback=None, widgets=None):
def __init__(self, iterable, steps=None, step_callback=None, watch=None, widgets=None):
self.steps = steps
self.iterable = iterable
self.step = 0
self.step_callback = step_callback
self.watch = watch
self.started = None
self.finished = None
self.setup_widgets(widgets)
Expand Down Expand Up @@ -141,3 +143,8 @@ def get_percentage(self):
class TransferBar(Bar):
DEFAULT_WIDGETS = [BarWidget, TransferWidget, TimerWidget, EtaWidget]

class WatchBar(Bar):
DEFAULT_WIDGETS = [BarWidget, ProgressWidget, TimerWidget, EtaWidget, WatchLenWidget]

class TransferWatchBar(WatchBar):
DEFAULT_WIDGETS = [BarWidget, TransferWidget, TimerWidget, EtaWidget, WatchLenWidget]
28 changes: 26 additions & 2 deletions frogress/tests/test_api.py
Expand Up @@ -9,16 +9,40 @@ class TestBar(unittest.TestCase):
def test_bar_passes_parameters(self):
seq = [1, 2, 3, 4, 5]
progressbar = frogress.bar(seq)
self.assertEqual(progressbar.iterable, seq)
self.assertIs(progressbar.iterable, seq)

def test_file(self):
seq = [1, 2, 3, 4, 5]
with tempfile.NamedTemporaryFile('w') as tmp:
text = 'foobar\n' * 25
tmp.write(text)
tmp.flush()
f = open(tmp.name)
bar = frogress.bar([], source=f)
bar = frogress.bar(seq, source=f)
self.assertIsInstance(bar, frogress.TransferBar)
self.assertEqual(bar.step_callback, f.tell)
self.assertEqual(bar.steps, len(text))
self.assertIs(bar.iterable, seq)

def test_watch(self):
a = []
seq = [1, 2, 3, 4, 5]
bar = frogress.bar(seq, watch=a)
self.assertIsInstance(bar, frogress.WatchBar)
self.assertEqual(bar.watch, a)
self.assertIs(bar.iterable, seq)

def test_watch_file(self):
a = []
seq = [1, 2, 3, 4, 5]
with tempfile.NamedTemporaryFile('w') as tmp:
text = 'foobar\n' * 25
tmp.write(text)
tmp.flush()
f = open(tmp.name)
bar = frogress.bar(seq, watch=a, source=f)
self.assertIsInstance(bar, frogress.TransferWatchBar)
self.assertIs(bar.watch, a)
self.assertEqual(bar.step_callback, f.tell)
self.assertEqual(bar.steps, len(text))
self.assertIs(bar.iterable, seq)
19 changes: 19 additions & 0 deletions frogress/tests/test_widgets.py
Expand Up @@ -201,3 +201,22 @@ def test_render(self):
self.bar.finished = True
self.assertRenderedWidgetEqual('Eta: --')

class TestWatchLenWidget(TestBaseWidget):
widget_class = frogress.WatchLenWidget
widget_attrs = {'prefix': 'Len: '}

def test_render(self):
self.bar.watch = [1,1,1]
self.assertRenderedWidgetEqual('Len: 3')

self.bar.watch = []
self.assertRenderedWidgetEqual('Len: 0')

self.bar.watch = set([1])
self.assertRenderedWidgetEqual('Len: 1')

self.bar.watch = {1:1, 2:2}
self.assertRenderedWidgetEqual('Len: 2')

self.bar.watch = None
self.assertRenderedWidgetEqual('Len: --')
10 changes: 10 additions & 0 deletions frogress/widgets.py
Expand Up @@ -115,3 +115,13 @@ def render(self, bar):
progress = humanize.time(estimated_total - seconds)
return ''.join((self.prefix, progress))


class WatchLenWidget(PrefixWidget):
default_prefix = 'Len: '

def render(self, bar):
if bar.watch is None:
length = '--'
else:
length = '%s' % (len(bar.watch),)
return ''.join((self.prefix, length))

0 comments on commit 9f3e586

Please sign in to comment.