Hello community, here is the log from the commit of package python-tqdm for openSUSE:Factory checked in at 2018-08-08 14:54:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-tqdm (Old) and /work/SRC/openSUSE:Factory/.python-tqdm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-tqdm" Wed Aug 8 14:54:06 2018 rev:11 rq:627954 version:4.24.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-tqdm/python-tqdm.changes 2018-07-14 20:27:45.908578167 +0200 +++ /work/SRC/openSUSE:Factory/.python-tqdm.new/python-tqdm.changes 2018-08-08 14:54:50.281682604 +0200 @@ -1,0 +2,11 @@ +Tue Aug 7 14:44:44 UTC 2018 - toddrme2...@gmail.com + +- update to 4.24.0 + * autonotebook submodule for automatic selection of notebook/CLI bar (#443, #508) + > update/add pandas() example documentation (#474) + * NameError:IntProgress changed to a more helpful ImportError (#187, #451, #558) + * support bool() cast when disable=True (#574) + * fix format_sizeof hundreds rounding (#579 -> #581) + * ensure URLs in documentation are secure (https) + +------------------------------------------------------------------- Old: ---- tqdm-4.23.4.tar.gz New: ---- tqdm-4.24.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-tqdm.spec ++++++ --- /var/tmp/diff_new_pack.mNWHw1/_old 2018-08-08 14:54:52.001685446 +0200 +++ /var/tmp/diff_new_pack.mNWHw1/_new 2018-08-08 14:54:52.001685446 +0200 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define oldpython python Name: python-tqdm -Version: 4.23.4 +Version: 4.24.0 Release: 0 Summary: An extensible progress meter License: MPL-2.0 AND MIT @@ -31,14 +31,17 @@ BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires(post): update-alternatives -Requires(postun): update-alternatives -BuildArch: noarch # SECTION test requirements +BuildRequires: %{python_module jupyter_ipython} +BuildRequires: %{python_module jupyter_ipywidgets} BuildRequires: %{python_module nose} BuildRequires: %{python_module numpy} BuildRequires: %{python_module pandas} # /SECTION +Requires(post): update-alternatives +Requires(postun): update-alternatives +BuildArch: noarch + %python_subpackages %description @@ -68,9 +71,10 @@ %python_uninstall_alternative tqdm %check -%{python_expand export PATH="$PATH:%{buildroot}%{_bindir}" -nosetests-%{$python_bin_suffix} --ignore-files="tests_perf\.py" --ignore-files="tests_synchronisation\.py" tqdm/ -} +# tests currently broken, see https://github.com/tqdm/tqdm/pull/586 +# %%{python_expand export PATH="$PATH:%{buildroot}%{_bindir}" +# nosetests-%%{$python_bin_suffix} --ignore-files="tests_perf\.py" --ignore-files="tests_synchronisation\.py" tqdm/ +# } %files %{python_files} %doc README.rst logo.png ++++++ tqdm-4.23.4.tar.gz -> tqdm-4.24.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/CONTRIBUTING.md new/tqdm-4.24.0/CONTRIBUTING.md --- old/tqdm-4.23.4/CONTRIBUTING.md 2018-05-14 01:34:20.000000000 +0200 +++ new/tqdm-4.24.0/CONTRIBUTING.md 2018-07-26 15:07:34.000000000 +0200 @@ -88,7 +88,7 @@ - regularly bump the version number in the file [_version.py](https://raw.githubusercontent.com/tqdm/tqdm/master/tqdm/_version.py) -- follow the [Semantic Versioning](http://semver.org/) convention +- follow the [Semantic Versioning](https://semver.org/) convention - take care of this (instead of users) to avoid PR conflicts solely due to the version file bumping diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/PKG-INFO new/tqdm-4.24.0/PKG-INFO --- old/tqdm-4.23.4/PKG-INFO 2018-05-22 21:06:50.000000000 +0200 +++ new/tqdm-4.24.0/PKG-INFO 2018-07-26 18:27:01.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: tqdm -Version: 4.23.4 +Version: 4.24.0 Summary: Fast, Extensible Progress Meter Home-page: https://github.com/tqdm/tqdm Author: Noam Yorav-Raphael @@ -675,6 +675,18 @@ |Screenshot-Jupyter2| |Screenshot-Jupyter3| + It is also possible to let ``tqdm`` automatically choose between + console or notebook versions by using the ``autonotebook`` submodule: + + .. code:: python + + from tqdm.autonotebook import tqdm + tqdm.pandas() + + Note that this will issue a ``TqdmExperimentalWarning`` if run in a notebook + since it is not meant to be possible to distinguish between ``jupyter notebook`` + and ``jupyter console``. + Writing messages ~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/README.rst new/tqdm-4.24.0/README.rst --- old/tqdm-4.23.4/README.rst 2018-05-14 01:34:20.000000000 +0200 +++ new/tqdm-4.24.0/README.rst 2018-07-26 15:07:34.000000000 +0200 @@ -665,6 +665,18 @@ |Screenshot-Jupyter2| |Screenshot-Jupyter3| +It is also possible to let ``tqdm`` automatically choose between +console or notebook versions by using the ``autonotebook`` submodule: + +.. code:: python + + from tqdm.autonotebook import tqdm + tqdm.pandas() + +Note that this will issue a ``TqdmExperimentalWarning`` if run in a notebook +since it is not meant to be possible to distinguish between ``jupyter notebook`` +and ``jupyter console``. + Writing messages ~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/examples/progressbar/__init__.py new/tqdm-4.24.0/examples/progressbar/__init__.py --- old/tqdm-4.23.4/examples/progressbar/__init__.py 2015-12-28 23:16:15.000000000 +0100 +++ new/tqdm-4.24.0/examples/progressbar/__init__.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,49 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# progressbar - Text progress bar library for Python. -# Copyright (c) 2005 Nilton Volpato -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -"""Text progress bar library for Python. - -A text progress bar is typically used to display the progress of a long -running operation, providing a visual cue that processing is underway. - -The ProgressBar class manages the current progress, and the format of the line -is given by a number of widgets. A widget is an object that may display -differently depending on the state of the progress bar. There are three types -of widgets: - - a string, which always shows itself - - - a ProgressBarWidget, which may return a different value every time its - update method is called - - - a ProgressBarWidgetHFill, which is like ProgressBarWidget, except it - expands to fill the remaining width of the line. - -The progressbar module is very easy to use, yet very powerful. It will also -automatically enable features like auto-resizing when the system supports it. -""" - -__author__ = 'Nilton Volpato' -__author_email__ = 'first-name dot last-name @ gmail.com' -__date__ = '2011-05-14' -__version__ = '2.3' - -from compat import * -from widgets import * -from progressbar import * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/examples/progressbar/compat.py new/tqdm-4.24.0/examples/progressbar/compat.py --- old/tqdm-4.23.4/examples/progressbar/compat.py 2015-12-28 23:16:15.000000000 +0100 +++ new/tqdm-4.24.0/examples/progressbar/compat.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# progressbar - Text progress bar library for Python. -# Copyright (c) 2005 Nilton Volpato -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -"""Compatibility methods and classes for the progressbar module.""" - - -# Python 3.x (and backports) use a modified iterator syntax -# This will allow 2.x to behave with 3.x iterators -try: - next -except NameError: - def next(iter): - try: - # Try new style iterators - return iter.__next__() - except AttributeError: - # Fallback in case of a "native" iterator - return iter.next() - - -# Python < 2.5 does not have "any" -try: - any -except NameError: - def any(iterator): - for item in iterator: - if item: return True - return False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/examples/progressbar/progressbar.py new/tqdm-4.24.0/examples/progressbar/progressbar.py --- old/tqdm-4.23.4/examples/progressbar/progressbar.py 2015-12-28 23:16:15.000000000 +0100 +++ new/tqdm-4.24.0/examples/progressbar/progressbar.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,306 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# progressbar - Text progress bar library for Python. -# Copyright (c) 2005 Nilton Volpato -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -"""Main ProgressBar class.""" - -from __future__ import division - -import math -import os -import signal -import sys -import time - -try: - from fcntl import ioctl - from array import array - import termios -except ImportError: - pass - -from compat import * # for: any, next -import widgets - - -class UnknownLength: pass - - -class ProgressBar(object): - """The ProgressBar class which updates and prints the bar. - - A common way of using it is like: - >>> pbar = ProgressBar().start() - >>> for i in range(100): - ... # do something - ... pbar.update(i+1) - ... - >>> pbar.finish() - - You can also use a ProgressBar as an iterator: - >>> progress = ProgressBar() - >>> for i in progress(some_iterable): - ... # do something - ... - - Since the progress bar is incredibly customizable you can specify - different widgets of any type in any order. You can even write your own - widgets! However, since there are already a good number of widgets you - should probably play around with them before moving on to create your own - widgets. - - The term_width parameter represents the current terminal width. If the - parameter is set to an integer then the progress bar will use that, - otherwise it will attempt to determine the terminal width falling back to - 80 columns if the width cannot be determined. - - When implementing a widget's update method you are passed a reference to - the current progress bar. As a result, you have access to the - ProgressBar's methods and attributes. Although there is nothing preventing - you from changing the ProgressBar you should treat it as read only. - - Useful methods and attributes include (Public API): - - currval: current progress (0 <= currval <= maxval) - - maxval: maximum (and final) value - - finished: True if the bar has finished (reached 100%) - - start_time: the time when start() method of ProgressBar was called - - seconds_elapsed: seconds elapsed since start_time and last call to - update - - percentage(): progress in percent [0..100] - """ - - __slots__ = ('currval', 'fd', 'finished', 'last_update_time', - 'left_justify', 'maxval', 'next_update', 'num_intervals', - 'poll', 'seconds_elapsed', 'signal_set', 'start_time', - 'term_width', 'update_interval', 'widgets', '_time_sensitive', - '__iterable') - - _DEFAULT_MAXVAL = 100 - _DEFAULT_TERMSIZE = 80 - _DEFAULT_WIDGETS = [widgets.Percentage(), ' ', widgets.Bar()] - - def __init__(self, maxval=None, widgets=None, term_width=None, poll=1, - left_justify=True, fd=sys.stderr): - """Initializes a progress bar with sane defaults.""" - - # Don't share a reference with any other progress bars - if widgets is None: - widgets = list(self._DEFAULT_WIDGETS) - - self.maxval = maxval - self.widgets = widgets - self.fd = fd - self.left_justify = left_justify - - self.signal_set = False - if term_width is not None: - self.term_width = term_width - else: - try: - self._handle_resize() - signal.signal(signal.SIGWINCH, self._handle_resize) - self.signal_set = True - except (SystemExit, KeyboardInterrupt): raise - except: - self.term_width = self._env_size() - - self.__iterable = None - self._update_widgets() - self.currval = 0 - self.finished = False - self.last_update_time = None - self.poll = poll - self.seconds_elapsed = 0 - self.start_time = None - self.update_interval = 1 - self.next_update = 0 - - - def __call__(self, iterable): - """Use a ProgressBar to iterate through an iterable.""" - - try: - self.maxval = len(iterable) - except: - if self.maxval is None: - self.maxval = UnknownLength - - self.__iterable = iter(iterable) - return self - - - def __iter__(self): - return self - - - def __next__(self): - try: - value = next(self.__iterable) - if self.start_time is None: - self.start() - else: - self.update(self.currval + 1) - return value - except StopIteration: - if self.start_time is None: - self.start() - self.finish() - raise - - - # Create an alias so that Python 2.x won't complain about not being - # an iterator. - next = __next__ - - - def _env_size(self): - """Tries to find the term_width from the environment.""" - - return int(os.environ.get('COLUMNS', self._DEFAULT_TERMSIZE)) - 1 - - - def _handle_resize(self, signum=None, frame=None): - """Tries to catch resize signals sent from the terminal.""" - - h, w = array('h', ioctl(self.fd, termios.TIOCGWINSZ, '\0' * 8))[:2] - self.term_width = w - - - def percentage(self): - """Returns the progress as a percentage.""" - if self.currval >= self.maxval: - return 100.0 - return self.currval * 100.0 / self.maxval - - percent = property(percentage) - - - def _format_widgets(self): - result = [] - expanding = [] - width = self.term_width - - for index, widget in enumerate(self.widgets): - if isinstance(widget, widgets.WidgetHFill): - result.append(widget) - expanding.insert(0, index) - else: - widget = widgets.format_updatable(widget, self) - result.append(widget) - width -= len(widget) - - count = len(expanding) - while count: - portion = max(int(math.ceil(width * 1. / count)), 0) - index = expanding.pop() - count -= 1 - - widget = result[index].update(self, portion) - width -= len(widget) - result[index] = widget - - return result - - - def _format_line(self): - """Joins the widgets and justifies the line.""" - - widgets = ''.join(self._format_widgets()) - - if self.left_justify: return widgets.ljust(self.term_width) - else: return widgets.rjust(self.term_width) - - - def _need_update(self): - """Returns whether the ProgressBar should redraw the line.""" - if self.currval >= self.next_update or self.finished: return True - - delta = time.time() - self.last_update_time - return self._time_sensitive and delta > self.poll - - - def _update_widgets(self): - """Checks all widgets for the time sensitive bit.""" - - self._time_sensitive = any(getattr(w, 'TIME_SENSITIVE', False) - for w in self.widgets) - - - def update(self, value=None): - """Updates the ProgressBar to a new value.""" - - if value is not None and value is not UnknownLength: - if (self.maxval is not UnknownLength - and not 0 <= value <= self.maxval): - - raise ValueError('Value out of range') - - self.currval = value - - - if not self._need_update(): return - if self.start_time is None: - raise RuntimeError('You must call "start" before calling "update"') - - now = time.time() - self.seconds_elapsed = now - self.start_time - self.next_update = self.currval + self.update_interval - self.fd.write(self._format_line() + '\r') - self.last_update_time = now - - - def start(self): - """Starts measuring time, and prints the bar at 0%. - - It returns self so you can use it like this: - >>> pbar = ProgressBar().start() - >>> for i in range(100): - ... # do something - ... pbar.update(i+1) - ... - >>> pbar.finish() - """ - - if self.maxval is None: - self.maxval = self._DEFAULT_MAXVAL - - self.num_intervals = max(100, self.term_width) - self.next_update = 0 - - if self.maxval is not UnknownLength: - if self.maxval < 0: raise ValueError('Value out of range') - self.update_interval = self.maxval / self.num_intervals - - - self.start_time = self.last_update_time = time.time() - self.update(0) - - return self - - - def finish(self): - """Puts the ProgressBar bar in the finished state.""" - - if self.finished: - return - self.finished = True - self.update(self.maxval) - self.fd.write('\n') - if self.signal_set: - signal.signal(signal.SIGWINCH, signal.SIG_DFL) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/examples/progressbar/widgets.py new/tqdm-4.24.0/examples/progressbar/widgets.py --- old/tqdm-4.23.4/examples/progressbar/widgets.py 2015-12-28 23:16:15.000000000 +0100 +++ new/tqdm-4.24.0/examples/progressbar/widgets.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,356 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# progressbar - Text progress bar library for Python. -# Copyright (c) 2005 Nilton Volpato -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -"""Default ProgressBar widgets.""" - -from __future__ import division - -import datetime -import math - -try: - from abc import ABCMeta, abstractmethod -except ImportError: - AbstractWidget = object - abstractmethod = lambda fn: fn -else: - AbstractWidget = ABCMeta('AbstractWidget', (object,), {}) - - -def format_updatable(updatable, pbar): - if hasattr(updatable, 'update'): return updatable.update(pbar) - else: return updatable - - -class Widget(AbstractWidget): - """The base class for all widgets. - - The ProgressBar will call the widget's update value when the widget should - be updated. The widget's size may change between calls, but the widget may - display incorrectly if the size changes drastically and repeatedly. - - The boolean TIME_SENSITIVE informs the ProgressBar that it should be - updated more often because it is time sensitive. - """ - - TIME_SENSITIVE = False - __slots__ = () - - @abstractmethod - def update(self, pbar): - """Updates the widget. - - pbar - a reference to the calling ProgressBar - """ - - -class WidgetHFill(Widget): - """The base class for all variable width widgets. - - This widget is much like the \\hfill command in TeX, it will expand to - fill the line. You can use more than one in the same line, and they will - all have the same width, and together will fill the line. - """ - - @abstractmethod - def update(self, pbar, width): - """Updates the widget providing the total width the widget must fill. - - pbar - a reference to the calling ProgressBar - width - The total width the widget must fill - """ - - -class Timer(Widget): - """Widget which displays the elapsed seconds.""" - - __slots__ = ('format_string',) - TIME_SENSITIVE = True - - def __init__(self, format='Elapsed Time: %s'): - self.format_string = format - - @staticmethod - def format_time(seconds): - """Formats time as the string "HH:MM:SS".""" - - return str(datetime.timedelta(seconds=int(seconds))) - - - def update(self, pbar): - """Updates the widget to show the elapsed time.""" - - return self.format_string % self.format_time(pbar.seconds_elapsed) - - -class ETA(Timer): - """Widget which attempts to estimate the time of arrival.""" - - TIME_SENSITIVE = True - - def update(self, pbar): - """Updates the widget to show the ETA or total time when finished.""" - - if pbar.currval == 0: - return 'ETA: --:--:--' - elif pbar.finished: - return 'Time: %s' % self.format_time(pbar.seconds_elapsed) - else: - elapsed = pbar.seconds_elapsed - eta = elapsed * pbar.maxval / pbar.currval - elapsed - return 'ETA: %s' % self.format_time(eta) - - -class AdaptiveETA(Timer): - """Widget which attempts to estimate the time of arrival. - - Uses a weighted average of two estimates: - 1) ETA based on the total progress and time elapsed so far - 2) ETA based on the progress as per tha last 10 update reports - - The weight depends on the current progress so that to begin with the - total progress is used and at the end only the most recent progress is - used. - """ - - TIME_SENSITIVE = True - NUM_SAMPLES = 10 - - def _update_samples(self, currval, elapsed): - sample = (currval, elapsed) - if not hasattr(self, 'samples'): - self.samples = [sample] * (self.NUM_SAMPLES + 1) - else: - self.samples.append(sample) - return self.samples.pop(0) - - def _eta(self, maxval, currval, elapsed): - return elapsed * maxval / float(currval) - elapsed - - def update(self, pbar): - """Updates the widget to show the ETA or total time when finished.""" - if pbar.currval == 0: - return 'ETA: --:--:--' - elif pbar.finished: - return 'Time: %s' % self.format_time(pbar.seconds_elapsed) - else: - elapsed = pbar.seconds_elapsed - currval1, elapsed1 = self._update_samples(pbar.currval, elapsed) - eta = self._eta(pbar.maxval, pbar.currval, elapsed) - if pbar.currval > currval1: - etasamp = self._eta(pbar.maxval - currval1, - pbar.currval - currval1, - elapsed - elapsed1) - weight = (pbar.currval / float(pbar.maxval)) ** 0.5 - eta = (1 - weight) * eta + weight * etasamp - return 'ETA: %s' % self.format_time(eta) - - -class FileTransferSpeed(Widget): - """Widget for showing the transfer speed (useful for file transfers).""" - - FORMAT = '%6.2f %s%s/s' - PREFIXES = ' kMGTPEZY' - __slots__ = ('unit',) - - def __init__(self, unit='B'): - self.unit = unit - - def update(self, pbar): - """Updates the widget with the current SI prefixed speed.""" - - if pbar.seconds_elapsed < 2e-6 or pbar.currval < 2e-6: # =~ 0 - scaled = power = 0 - else: - speed = pbar.currval / pbar.seconds_elapsed - power = int(math.log(speed, 1000)) - scaled = speed / 1000.**power - - return self.FORMAT % (scaled, self.PREFIXES[power], self.unit) - - -class AnimatedMarker(Widget): - """An animated marker for the progress bar which defaults to appear as if - it were rotating. - """ - - __slots__ = ('markers', 'curmark') - - def __init__(self, markers='|/-\\'): - self.markers = markers - self.curmark = -1 - - def update(self, pbar): - """Updates the widget to show the next marker or the first marker when - finished""" - - if pbar.finished: return self.markers[0] - - self.curmark = (self.curmark + 1) % len(self.markers) - return self.markers[self.curmark] - -# Alias for backwards compatibility -RotatingMarker = AnimatedMarker - - -class Counter(Widget): - """Displays the current count.""" - - __slots__ = ('format_string',) - - def __init__(self, format='%d'): - self.format_string = format - - def update(self, pbar): - return self.format_string % pbar.currval - - -class Percentage(Widget): - """Displays the current percentage as a number with a percent sign.""" - - def update(self, pbar): - return '%3d%%' % pbar.percentage() - - -class FormatLabel(Timer): - """Displays a formatted label.""" - - mapping = { - 'elapsed': ('seconds_elapsed', Timer.format_time), - 'finished': ('finished', None), - 'last_update': ('last_update_time', None), - 'max': ('maxval', None), - 'seconds': ('seconds_elapsed', None), - 'start': ('start_time', None), - 'value': ('currval', None) - } - - __slots__ = ('format_string',) - def __init__(self, format): - self.format_string = format - - def update(self, pbar): - context = {} - for name, (key, transform) in self.mapping.items(): - try: - value = getattr(pbar, key) - - if transform is None: - context[name] = value - else: - context[name] = transform(value) - except: pass - - return self.format_string % context - - -class SimpleProgress(Widget): - """Returns progress as a count of the total (e.g.: "5 of 47").""" - - __slots__ = ('sep',) - - def __init__(self, sep=' of '): - self.sep = sep - - def update(self, pbar): - return '%d%s%d' % (pbar.currval, self.sep, pbar.maxval) - - -class Bar(WidgetHFill): - """A progress bar which stretches to fill the line.""" - - __slots__ = ('marker', 'left', 'right', 'fill', 'fill_left') - - def __init__(self, marker='#', left='|', right='|', fill=' ', - fill_left=True): - """Creates a customizable progress bar. - - marker - string or updatable object to use as a marker - left - string or updatable object to use as a left border - right - string or updatable object to use as a right border - fill - character to use for the empty part of the progress bar - fill_left - whether to fill from the left or the right - """ - self.marker = marker - self.left = left - self.right = right - self.fill = fill - self.fill_left = fill_left - - - def update(self, pbar, width): - """Updates the progress bar and its subcomponents.""" - - left, marked, right = (format_updatable(i, pbar) for i in - (self.left, self.marker, self.right)) - - width -= len(left) + len(right) - # Marked must *always* have length of 1 - if pbar.maxval: - marked *= int(pbar.currval / pbar.maxval * width) - else: - marked = '' - - if self.fill_left: - return '%s%s%s' % (left, marked.ljust(width, self.fill), right) - else: - return '%s%s%s' % (left, marked.rjust(width, self.fill), right) - - -class ReverseBar(Bar): - """A bar which has a marker which bounces from side to side.""" - - def __init__(self, marker='#', left='|', right='|', fill=' ', - fill_left=False): - """Creates a customizable progress bar. - - marker - string or updatable object to use as a marker - left - string or updatable object to use as a left border - right - string or updatable object to use as a right border - fill - character to use for the empty part of the progress bar - fill_left - whether to fill from the left or the right - """ - self.marker = marker - self.left = left - self.right = right - self.fill = fill - self.fill_left = fill_left - - -class BouncingBar(Bar): - def update(self, pbar, width): - """Updates the progress bar and its subcomponents.""" - - left, marker, right = (format_updatable(i, pbar) for i in - (self.left, self.marker, self.right)) - - width -= len(left) + len(right) - - if pbar.finished: return '%s%s%s' % (left, width * marker, right) - - position = int(pbar.currval % (width * 2 - 1)) - if position > width: position = width * 2 - position - lpad = self.fill * (position - 1) - rpad = self.fill * (width - len(marker) - len(lpad)) - - # Swap if we want to bounce the other way - if not self.fill_left: rpad, lpad = lpad, rpad - - return '%s%s%s%s%s' % (left, lpad, marker, rpad, right) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tox.ini new/tqdm-4.24.0/tox.ini --- old/tqdm-4.23.4/tox.ini 2018-05-14 01:34:20.000000000 +0200 +++ new/tqdm-4.24.0/tox.ini 2018-07-26 15:07:34.000000000 +0200 @@ -1,4 +1,4 @@ -# Tox (http://tox.testrun.org/) is a tool for running tests +# Tox (https://tox.testrun.org/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm/_tqdm.py new/tqdm-4.24.0/tqdm/_tqdm.py --- old/tqdm-4.23.4/tqdm/_tqdm.py 2018-05-22 21:02:36.000000000 +0200 +++ new/tqdm-4.24.0/tqdm/_tqdm.py 2018-07-26 15:07:34.000000000 +0200 @@ -141,7 +141,7 @@ Number with Order of Magnitude SI unit postfix. """ for unit in ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z']: - if abs(num) < 999.95: + if abs(num) < 999.5: if abs(num) < 99.95: if abs(num) < 9.995: return '{0:1.2f}'.format(num) + unit + suffix @@ -748,12 +748,19 @@ if disable is None and hasattr(file, "isatty") and not file.isatty(): disable = True + if total is None and iterable is not None: + try: + total = len(iterable) + except (TypeError, AttributeError): + total = None + if disable: self.iterable = iterable self.disable = disable self.pos = self._get_free_pos(self) self._instances.remove(self) self.n = initial + self.total = total return if kwargs: @@ -766,12 +773,6 @@ else TqdmKeyError("Unknown argument(s): " + str(kwargs))) # Preprocess the arguments - if total is None and iterable is not None: - try: - total = len(iterable) - except (TypeError, AttributeError): - total = None - if ((ncols is None) and (file in (sys.stderr, sys.stdout))) or \ dynamic_ncols: # pragma: no cover if dynamic_ncols: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm/_tqdm_notebook.py new/tqdm-4.24.0/tqdm/_tqdm_notebook.py --- old/tqdm-4.23.4/tqdm/_tqdm_notebook.py 2018-05-14 01:34:20.000000000 +0200 +++ new/tqdm-4.24.0/tqdm/_tqdm_notebook.py 2018-07-26 15:07:34.000000000 +0200 @@ -92,12 +92,20 @@ # fp = file # Prepare IPython progress bar - if total: - pbar = IntProgress(min=0, max=total) - else: # No total? Show info style bar with no progress tqdm status - pbar = IntProgress(min=0, max=1) - pbar.value = 1 - pbar.bar_style = 'info' + try: + if total: + pbar = IntProgress(min=0, max=total) + else: # No total? Show info style bar with no progress tqdm status + pbar = IntProgress(min=0, max=1) + pbar.value = 1 + pbar.bar_style = 'info' + except NameError: + # #187 #451 #558 + raise ImportError( + "IntProgress not found. Please update juputer and ipywidgets." + " See https://ipywidgets.readthedocs.io/en/stable" + "/user_install.html") + if desc: pbar.description = desc # Prepare status text diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm/_version.py new/tqdm-4.24.0/tqdm/_version.py --- old/tqdm-4.23.4/tqdm/_version.py 2018-05-22 21:03:00.000000000 +0200 +++ new/tqdm-4.24.0/tqdm/_version.py 2018-07-26 15:08:22.000000000 +0200 @@ -5,7 +5,7 @@ __all__ = ["__version__"] # major, minor, patch, -extra -version_info = 4, 23, 4 +version_info = 4, 24, 0 # Nice string for the version __version__ = '.'.join(map(str, version_info)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm/tests/tests_tqdm.py new/tqdm-4.24.0/tqdm/tests/tests_tqdm.py --- old/tqdm-4.23.4/tqdm/tests/tests_tqdm.py 2018-05-14 01:34:20.000000000 +0200 +++ new/tqdm-4.24.0/tqdm/tests/tests_tqdm.py 2018-07-26 15:07:34.000000000 +0200 @@ -1558,3 +1558,47 @@ else: tqdm.set_lock(mp_lock) # TODO: test interleaved output #445 + + +@with_setup(pretest, posttest) +def test_bool(): + """Test boolean cast""" + def internal(our_file, disable): + with tqdm(total=10, file=our_file, disable=disable) as t: + assert t + with tqdm(total=0, file=our_file, disable=disable) as t: + assert not t + with trange(10, file=our_file, disable=disable) as t: + assert t + with trange(0, file=our_file, disable=disable) as t: + assert not t + with tqdm([], file=our_file, disable=disable) as t: + assert not t + with tqdm([0], file=our_file, disable=disable) as t: + assert t + with tqdm(file=our_file, disable=disable) as t: + try: + print(bool(t)) + except TypeError: + pass + else: + raise TypeError( + "Expected tqdm() with neither total nor iterable to fail") + + # test with and without disable + with closing(StringIO()) as our_file: + internal(our_file, False) + internal(our_file, True) + + +@with_setup(pretest, posttest) +def test_autonotebook(): + """Test autonotebook fallback""" + from tqdm.autonotebook import tqdm as tn + from tqdm.autonotebook import trange as tr + + with closing(StringIO()) as our_file: + with tn(total=10, file=our_file) as t: + assert len(t) == 10 + with tr(1337) as t: + assert len(t) == 1337 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm.egg-info/PKG-INFO new/tqdm-4.24.0/tqdm.egg-info/PKG-INFO --- old/tqdm-4.23.4/tqdm.egg-info/PKG-INFO 2018-05-22 21:06:50.000000000 +0200 +++ new/tqdm-4.24.0/tqdm.egg-info/PKG-INFO 2018-07-26 18:27:01.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: tqdm -Version: 4.23.4 +Version: 4.24.0 Summary: Fast, Extensible Progress Meter Home-page: https://github.com/tqdm/tqdm Author: Noam Yorav-Raphael @@ -675,6 +675,18 @@ |Screenshot-Jupyter2| |Screenshot-Jupyter3| + It is also possible to let ``tqdm`` automatically choose between + console or notebook versions by using the ``autonotebook`` submodule: + + .. code:: python + + from tqdm.autonotebook import tqdm + tqdm.pandas() + + Note that this will issue a ``TqdmExperimentalWarning`` if run in a notebook + since it is not meant to be possible to distinguish between ``jupyter notebook`` + and ``jupyter console``. + Writing messages ~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.23.4/tqdm.egg-info/SOURCES.txt new/tqdm-4.24.0/tqdm.egg-info/SOURCES.txt --- old/tqdm-4.23.4/tqdm.egg-info/SOURCES.txt 2018-05-22 21:06:50.000000000 +0200 +++ new/tqdm-4.24.0/tqdm.egg-info/SOURCES.txt 2018-07-26 18:27:01.000000000 +0200 @@ -16,10 +16,6 @@ examples/redirect_print.py examples/simple_examples.py examples/tqdm_wget.py -examples/progressbar/__init__.py -examples/progressbar/compat.py -examples/progressbar/progressbar.py -examples/progressbar/widgets.py tqdm/__init__.py tqdm/__main__.py tqdm/_main.py