Hello community,

here is the log from the commit of package python-tqdm for openSUSE:Factory 
checked in at 2019-06-04 12:12:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-tqdm (Old)
 and      /work/SRC/openSUSE:Factory/.python-tqdm.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-tqdm"

Tue Jun  4 12:12:34 2019 rev:19 rq:707289 version:4.32.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-tqdm/python-tqdm.changes  2019-02-27 
15:05:41.322455416 +0100
+++ /work/SRC/openSUSE:Factory/.python-tqdm.new.5148/python-tqdm.changes        
2019-06-04 12:12:55.327810345 +0200
@@ -1,0 +2,12 @@
+Mon Jun  3 18:31:35 UTC 2019 - Todd R <[email protected]>
+
+- Update to 4.32.1
+  * fix notebook with unknown total
+- Update to 4.32.0
+  * support unit_scale in notebook
+  * support negative update (#432, #545)
+  * add reset() function (#547, #545)
+  * add [python setup.py] make run
+- Fix jupyter dependencies.
+
+-------------------------------------------------------------------

Old:
----
  tqdm-4.31.1.tar.gz

New:
----
  tqdm-4.32.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-tqdm.spec ++++++
--- /var/tmp/diff_new_pack.A94vpt/_old  2019-06-04 12:12:56.323810018 +0200
+++ /var/tmp/diff_new_pack.A94vpt/_new  2019-06-04 12:12:56.327810017 +0200
@@ -28,14 +28,13 @@
 %bcond_with test
 %endif
 Name:           python-tqdm%{suffix}
-Version:        4.31.1
+Version:        4.32.1
 Release:        0
 Summary:        An extensible progress meter
 License:        MPL-2.0 AND MIT
 Group:          Development/Languages/Python
 URL:            https://github.com/tqdm/tqdm
 Source:         
https://files.pythonhosted.org/packages/source/t/tqdm/tqdm-%{version}.tar.gz
-BuildRequires:  %{python_module rpm-macros}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
@@ -44,8 +43,8 @@
 BuildArch:      noarch
 %if %{with test}
 # SECTION test requirements
-BuildRequires:  %{python_module jupyter_ipython}
-BuildRequires:  %{python_module jupyter_ipywidgets}
+BuildRequires:  %{python_module ipython}
+BuildRequires:  %{python_module ipywidgets}
 BuildRequires:  %{python_module nose}
 BuildRequires:  %{python_module numpy}
 BuildRequires:  %{python_module pandas}

++++++ tqdm-4.31.1.tar.gz -> tqdm-4.32.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/CONTRIBUTING.md 
new/tqdm-4.32.1/CONTRIBUTING.md
--- old/tqdm-4.31.1/CONTRIBUTING.md     2019-02-10 19:39:01.000000000 +0100
+++ new/tqdm-4.32.1/CONTRIBUTING.md     2019-05-14 00:41:59.000000000 +0200
@@ -203,6 +203,9 @@
 
 ### Upload
 
+Travis CI should automatically do this after pushing tags.
+Manual instructions are given below in case of failure.
+
 Build `tqdm` into a distributable python package:
 
 ```
@@ -220,13 +223,34 @@
 ```
 
 Also, the new release can (should) be added to GitHub by creating a new
-release from the web interface; uploading packages from the `dist/` folder
+release from the [web interface](https://github.com/tqdm/tqdm/releases);
+uploading packages from the `dist/` folder
 created by `[python setup.py] make build`.
 The [wiki] can be automatically updated with GitHub release notes by
 running `make` within the wiki repository.
 
 [wiki]: https://github.com/tqdm/tqdm/wiki
 
+Docker images may be uploaded to <https://hub.docker.com/r/tqdm/tqdm>.
+Assuming `docker` is
+[installed](https://docs.docker.com/install/linux/docker-ce/ubuntu/):
+
+```
+make -B docker
+docker login
+docker push tqdm/tqdm:latest
+docker push tqdm/tqdm:$(docker run -i --rm tqdm/tqdm -v)
+```
+
+Snaps may be uploaded to <https://snapcraft.io/tqdm>.
+Assuming `snapcraft` is installed (`snap install snapcraft --classic --beta`):
+
+```
+make snap
+snapcraft login
+snapcraft push tqdm*.snap --release stable
+```
+
 ### Notes
 
 - you can also test on the PyPI test servers `test.pypi.org`
@@ -275,15 +299,27 @@
 6. `git tag vM.m.p && git push --tags`
 7. `[python setup.py] make distclean`
 8. `[python setup.py] make build`
-9. upload to PyPI using one of the following:
-    a) `[python setup.py] make pypi`
+9. **`[AUTO:TravisCI]`** upload to PyPI. either:
+    a) `[python setup.py] make pypi`, or
     b) `twine upload -s -i $(git config user.signingkey) dist/tqdm-*`
-10. create new release on <https://github.com/tqdm/tqdm/releases>
+10. **`[AUTO:TravisCI]`** upload to docker hub:
+    a) `make -B docker`
+    b) `docker push tqdm/tqdm:latest`
+    c) `docker push tqdm/tqdm:$(docker run -i --rm tqdm/tqdm -v)`
+11. upload to snapcraft:
+    a) `make snap`, and
+    b) `snapcraft push tqdm*.snap --release stable`
+12. create new release on <https://github.com/tqdm/tqdm/releases>
     a) add helpful release notes
-    b) attach `dist/tqdm-*` binaries (usually only `*.whl*`)
-11. run `make` in the `wiki` submodule to update release notes
-12. run `make deploy` in the `docs` submodule to update website
-13. accept the automated PR in the `feedstock` submodule to update conda
-
-The last three steps require a one-time `make submodules` to clone
-`docs`, `wiki`, and `feedstock`.
+    b) **`[AUTO:TravisCI]`** attach `dist/tqdm-*` binaries
+       (usually only `*.whl*`)
+13. **`[SUB]`** run `make` in the `wiki` submodule to update release notes
+14. **`[SUB]`** run `make deploy` in the `docs` submodule to update website
+15. **`[SUB]`** accept the automated PR in the `feedstock` submodule to update 
conda
+
+Key:
+
+- **`[AUTO:TravisCI]`**: Travis CI should automatically do this after
+  `git push --tags` (6)
+- **`[SUB]`**:  Requires one-time `make submodules` to clone
+  `docs`, `wiki`, and `feedstock`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/DEMO.ipynb new/tqdm-4.32.1/DEMO.ipynb
--- old/tqdm-4.31.1/DEMO.ipynb  2019-01-25 22:03:17.000000000 +0100
+++ new/tqdm-4.32.1/DEMO.ipynb  2019-05-14 00:41:59.000000000 +0200
@@ -7,8 +7,8 @@
     "<h1 align=\"center\">tqdm</h1>\n",
     "<img 
src=\"https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif\"; 
align=\"left\" />\n",
     "\n",
-    
"[![PyPI-Versions](https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white)](https://pypi.org/project/tqdm)|[![PyPI-Status](https://img.shields.io/pypi/v/tqdm.svg)](https://pypi.org/project/tqdm)|[![Conda-Forge-Status](https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge)](https://anaconda.org/conda-forge/tqdm)\n",
-    "-|-|-\n",
+    
"[![PyPI-Versions](https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white)](https://pypi.org/project/tqdm)|[![PyPI-Status](https://img.shields.io/pypi/v/tqdm.svg)](https://pypi.org/project/tqdm)|[![Conda-Forge-Status](https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge&logo=conda-forge)](https://anaconda.org/conda-forge/tqdm)|[![Snapcraft](https://img.shields.io/badge/snap-install-82BEA0.svg?logo=snapcraft)](https://snapcraft.io/tqdm)\n",
+    "-|-|-|-\n",
     "\n",
     
"[![Build-Status](https://img.shields.io/travis/tqdm/tqdm/master.svg?logo=travis)](https://travis-ci.org/tqdm/tqdm)|[![Coverage-Status](https://coveralls.io/repos/tqdm/tqdm/badge.svg?branch=master)](https://coveralls.io/github/tqdm/tqdm)|[![Branch-Coverage-Status](https://codecov.io/gh/tqdm/tqdm/branch/master/graph/badge.svg)](https://codecov.io/gh/tqdm/tqdm)|[![Codacy-Grade](https://api.codacy.com/project/badge/Grade/3f965571598f44549c7818f29cdcf177)](https://www.codacy.com/app/tqdm/tqdm?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=tqdm/tqdm&amp;utm_campaign=Badge_Grade)|[![Libraries-Rank](https://img.shields.io/librariesio/sourcerank/pypi/tqdm.svg?logo=koding&logoColor=white)](https://libraries.io/pypi/tqdm)|[![PyPI-Downloads](https://img.shields.io/pypi/dm/tqdm.svg?label=pypi%20downloads&logo=python&logoColor=white)](https://pypi.org/project/tqdm)\n",
     "-|-|-|-|-|-\n",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/Makefile new/tqdm-4.32.1/Makefile
--- old/tqdm-4.31.1/Makefile    2019-02-10 19:44:40.000000000 +0100
+++ new/tqdm-4.32.1/Makefile    2019-05-14 00:41:59.000000000 +0200
@@ -23,8 +23,11 @@
        build
        buildupload
        pypi
+       snap
+       docker
        help
        none
+       run
 
 help:
        @python setup.py make -p
@@ -51,6 +54,7 @@
 
 testsetup:
        @make README.rst
+       @make tqdm/tqdm.1
        python setup.py check --restructuredtext --strict
        python setup.py make none
 
@@ -80,7 +84,7 @@
        asv publish
        asv preview
 
-tqdm/tqdm.1: .tqdm.1.md
+tqdm/tqdm.1: .tqdm.1.md tqdm/_main.py tqdm/_tqdm.py
        # TODO: add to mkdocs.py
        python -m tqdm --help | tail -n+5 |\
     sed -r -e 's/\\/\\\\/g' \
@@ -92,6 +96,17 @@
 README.rst: .readme.rst tqdm/_tqdm.py tqdm/_main.py
        @python mkdocs.py
 
+snapcraft.yaml: .snapcraft.yml
+       cat "$<" | sed -e 's/{version}/'"`python -m tqdm --version`"'/g' \
+    -e 's/{commit}/'"`git describe --always`"'/g' \
+    -e 's/{source}/./g' -e 's/{icon}/logo.png/g' \
+    -e 's/{description}/https:\/\/tqdm.github.io/g' > "$@"
+
+.dockerignore: .gitignore
+       cat $^ > "$@"
+       echo -e ".git" > "$@"
+       git clean -xdn | sed -nr 's/^Would remove (.*)$$/\1/p' >> "$@"
+
 distclean:
        @+make coverclean
        @+make prebuildclean
@@ -138,5 +153,17 @@
        @make build
        @make pypi
 
+snap:
+       @make snapcraft.yaml
+       snapcraft
+docker:
+       @make .dockerignore
+       @make coverclean
+       @make clean
+       docker build . -t tqdm/tqdm
+       docker tag tqdm/tqdm:latest tqdm/tqdm:$(shell docker run -i --rm 
tqdm/tqdm -v)
 none:
        # used for unit testing
+
+run:
+       python -Om tqdm --help
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/PKG-INFO new/tqdm-4.32.1/PKG-INFO
--- old/tqdm-4.31.1/PKG-INFO    2019-02-10 20:01:19.000000000 +0100
+++ new/tqdm-4.32.1/PKG-INFO    2019-05-14 00:43:35.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: tqdm
-Version: 4.31.1
+Version: 4.32.1
 Summary: Fast, Extensible Progress Meter
 Home-page: https://github.com/tqdm/tqdm
 Maintainer: tqdm developers
@@ -11,15 +11,15 @@
         tqdm
         ====
         
-        |PyPI-Versions| |PyPI-Status| |Conda-Forge-Status|
+        |PyPI-Versions| |PyPI-Status| |Conda-Forge-Status| |Docker| |Snapcraft|
         
         |Build-Status| |Coverage-Status| |Branch-Coverage-Status| 
|Codacy-Grade| |Libraries-Rank| |PyPI-Downloads|
         
-        |DOI-URI| |LICENCE| |OpenHub-Status| |interactive-demo|
+        |DOI-URI| |LICENCE| |OpenHub-Status| |binder-demo| |notebook-demo|
         
         
-        ``tqdm`` means "progress" in Arabic (taqadum, تقدّم)
-        and is an abbreviation for "I love you so much" in Spanish (te quiero 
demasiado).
+        ``tqdm`` means "progress" in Arabic (*taqadum*, تقدّم)
+        and is an abbreviation for "I love you so much" in Spanish (*te quiero 
demasiado*).
         
         Instantly make your loops show a smart progress meter - just wrap any
         iterable with ``tqdm(iterable)``, and you're done!
@@ -106,6 +106,24 @@
         
             conda install -c conda-forge tqdm
         
+        Latest Snapcraft release
+        ~~~~~~~~~~~~~~~~~~~~~~~~
+        
+        |Snapcraft|
+        
+        .. code:: sh
+        
+            snap install tqdm
+        
+        Latest Docker release
+        ~~~~~~~~~~~~~~~~~~~~~
+        
+        |Docker|
+        
+        .. code:: sh
+        
+            docker pull tqdm/tqdm
+            docker run -i --rm tqdm/tqdm --help
         
         Changelog
         ---------
@@ -428,28 +446,26 @@
                   """
         
               def close(self):
-                  """
-                  Cleanup and (if leave=False) close the progressbar.
-                  """
-        
-              def unpause(self):
-                  """
-                  Restart tqdm timer from last print time.
-                  """
+                  """Cleanup and (if leave=False) close the progressbar."""
         
               def clear(self, nomove=False):
-                  """
-                  Clear current bar display
-                  """
+                  """Clear current bar display."""
         
               def refresh(self):
-                  """
-                  Force refresh the display of this bar
-                  """
+                  """Force refresh the display of this bar."""
         
-              def write(cls, s, file=sys.stdout, end="\n"):
+              def unpause(self):
+                  """Restart tqdm timer from last print time."""
+        
+              def reset(self, total=None):
                   """
-                  Print a message via tqdm (without overlap with bars)
+                  Resets to 0 iterations for repeated use.
+        
+                  Consider combining with ``leave=True``.
+        
+                  Parameters
+                  ----------
+                  total  : int, optional. Total to use for the new bar.
                   """
         
               def set_description(self, desc=None, refresh=True):
@@ -470,8 +486,32 @@
         
                   Parameters
                   ----------
+                  ordered_dict  : dict or OrderedDict, optional
                   refresh  : bool, optional
                       Forces refresh [default: True].
+                  kwargs  : dict, optional
+                  """
+        
+              @classmethod
+              def write(cls, s, file=sys.stdout, end="\n"):
+                  """Print a message via tqdm (without overlap with bars)."""
+        
+              @property
+              def format_dict(self):
+                  """Public API for read-only member access."""
+        
+              def display(self, msg=None, pos=None):
+                  """
+                  Use ``self.sp`` to display ``msg`` in the specified ``pos``.
+        
+                  Consider overloading this function when inheriting to use 
e.g.:
+                  ``self.some_frontend(**self.format_dict)`` instead of 
``self.sp``.
+        
+                  Parameters
+                  ----------
+                  msg  : str, optional. What to display (default: 
``repr(self)``).
+                  pos  : int, optional. Position to ``moveto``
+                    (default: ``abs(self.pos)``).
                   """
         
             def trange(*args, **kwargs):
@@ -481,24 +521,16 @@
                 """
         
             class tqdm_gui(tqdm):
-                """
-                Experimental GUI version of tqdm!
-                """
+                """Experimental GUI version"""
         
             def tgrange(*args, **kwargs):
-                """
-                Experimental GUI version of trange!
-                """
+                """Experimental GUI version of trange"""
         
             class tqdm_notebook(tqdm):
-                """
-                Experimental IPython/Jupyter Notebook widget using tqdm!
-                """
+                """Experimental IPython/Jupyter Notebook widget"""
         
             def tnrange(*args, **kwargs):
-                """
-                Experimental IPython/Jupyter Notebook widget using tqdm!
-                """
+                """Experimental IPython/Jupyter Notebook widget version of 
trange"""
         
         
         Examples and Advanced Usage
@@ -507,11 +539,12 @@
         - See the `examples 
<https://github.com/tqdm/tqdm/tree/master/examples>`__
           folder;
         - import the module and run ``help()``;
-        - consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__.
+        - consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__;
             - this has an
               `excellent article 
<https://github.com/tqdm/tqdm/wiki/How-to-make-a-great-Progress-Bar>`__
-              on how to make a **great** progressbar, or
-        - run the |interactive-demo|.
+              on how to make a **great** progressbar;
+        - run the |notebook-demo| or |binder-demo|, or
+        - check out the `slides from PyData London 
<https://tqdm.github.io/PyData2019/slides.html>`__.
         
         Description and additional stats
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -747,9 +780,64 @@
         Consider overloading ``display()`` to use e.g.
         ``self.frontend(**self.format_dict)`` instead of 
``self.sp(repr(self))``.
         
+        Dynamic Monitor/Meter
+        ~~~~~~~~~~~~~~~~~~~~~
+        
+        You can use a ``tqdm`` as a meter which is not monotonically 
increasing.
+        This could be because ``n`` decreases (e.g. a CPU usage monitor) or 
``total``
+        changes.
+        
+        One example would be recursively searching for files. The ``total`` is 
the
+        number of objects found so far, while ``n`` is the number of those 
objects which
+        are files (rather than folders):
+        
+        .. code:: python
+        
+            from tqdm import tqdm
+            import os.path
+        
+            def find_files_recursively(path, show_progress=True):
+                files = []
+                # total=1 assumes `path` is a file
+                t = tqdm(total=1, unit="file", disable=not show_progress)
+                if not os.path.exists(path):
+                    raise IOError("Cannot find:" + path)
+        
+                def append_found_file(f):
+                    files.append(f)
+                    t.update()
+        
+                def list_found_dir(path):
+                    """returns os.listdir(path) assuming os.path.isdir(path)"""
+                    listing = os.listdir(path)
+                    # subtract 1 since a "file" we found was actually this 
directory
+                    t.total += len(listing) - 1
+                    # fancy way to give info without forcing a refresh
+                    t.set_postfix(dir=path[-10:], refresh=False)
+                    t.update(0)  # may trigger a refresh
+                    return listing
+        
+                def recursively_search(path):
+                    if os.path.isdir(path):
+                        for f in list_found_dir(path):
+                            recursively_search(os.path.join(path, f))
+                    else:
+                        append_found_file(path)
+        
+                recursively_search(path)
+                t.set_postfix(dir=path)
+                t.close()
+                return files
+        
+        Using ``update(0)`` is a handy way to let ``tqdm`` decide when to 
trigger a
+        display refresh to avoid console spamming.
+        
         Writing messages
         ~~~~~~~~~~~~~~~~
         
+        This is a work in progress (see
+        `#737 <https://github.com/tqdm/tqdm/issues/737>`__).
+        
         Since ``tqdm`` uses a simple printing mechanism to display progress 
bars,
         you should not write any message in the terminal using ``print()`` 
while
         a progressbar is open.
@@ -871,7 +959,7 @@
         Contributions
         -------------
         
-        |GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|
+        |GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status| 
|GitHub-Contributions|
         
         All source code is hosted on `GitHub <https://github.com/tqdm/tqdm>`__.
         Contributions are welcome.
@@ -880,6 +968,24 @@
         `CONTRIBUTING 
<https://raw.githubusercontent.com/tqdm/tqdm/master/CONTRIBUTING.md>`__
         file for more information.
         
+        Developers who have made significant contributions, ranked by *LoC*
+        (surviving lines of code,
+        `git fame -wMC --excl '\.(png|gif|enc)$' 
<https://github.com/casperdcl/git-fame>`__),
+        are:
+        
+        ==================== 
================================================== ==== 
================================
+        Name                 ID                                                
 LoC  Notes
+        ==================== 
================================================== ==== 
================================
+        Casper da Costa-Luis `casperdcl <https://github.com/casperdcl>`__      
 ~3/4 primary maintainer |Gift-Casper|
+        Stephen Larroque     `lrq3000 <https://github.com/lrq3000>`__          
 ~1/6 team member
+        Noam Yorav-Raphael   `noamraph <https://github.com/noamraph>`__        
 ~1%  original author
+        Matthew Stevens      `mjstevens777 
<https://github.com/mjstevens777>`__ ~1%
+        Guangshuo Chen       `chengs <https://github.com/chengs>`__            
 ~1%
+        Hadrien Mary         `hadim <https://github.com/hadim>`__              
 ~1%  team member
+        Mikhail Korobov      `kmike <https://github.com/kmike>`__              
 ~1%  team member
+        Kyle Altendorf       `altendky <https://github.com/altendky>`__        
 ~1%
+        ==================== 
================================================== ==== 
================================
+        
         Ports to Other Languages
         ~~~~~~~~~~~~~~~~~~~~~~~~
         
@@ -894,24 +1000,6 @@
         
         Citation information: |DOI-URI|
         
-        
-        Authors
-        -------
-        
-        The main developers, ranked by surviving lines of code
-        (`git fame -wMC --excl '\.(png|gif)$' 
<https://github.com/casperdcl/git-fame>`__), are:
-        
-        - Casper da Costa-Luis (`casperdcl <https://github.com/casperdcl>`__, 
~2/3, |Gift-Casper|)
-        - Stephen Larroque (`lrq3000 <https://github.com/lrq3000>`__, ~1/5)
-        - Matthew Stevens (`mjstevens777 <https://github.com/mjstevens777>`__, 
~2%)
-        - Noam Yorav-Raphael (`noamraph <https://github.com/noamraph>`__, ~2%, 
original author)
-        - Guangshuo Chen (`chengs <https://github.com/chengs>`__, ~1%)
-        - Hadrien Mary (`hadim <https://github.com/hadim>`__, ~1%)
-        - Mikhail Korobov (`kmike <https://github.com/kmike>`__, ~1%)
-        - Kyle Altendorf (`altendky <https://github.com/altendky>`__, ~1%)
-        
-        There are also many |GitHub-Contributions| which we are grateful for.
-        
         |README-Hits| (Since 19 May 2016)
         
         .. |Logo| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif
@@ -933,23 +1021,27 @@
         .. |GitHub-Commits| image:: 
https://img.shields.io/github/commit-activity/y/tqdm/tqdm.svg?logo=git&logoColor=white
            :target: https://github.com/tqdm/tqdm/graphs/commit-activity
         .. |GitHub-Issues| image:: 
https://img.shields.io/github/issues-closed/tqdm/tqdm.svg?logo=github&logoColor=white
-           :target: https://github.com/tqdm/tqdm/issues
+           :target: https://github.com/tqdm/tqdm/issues?q=
         .. |GitHub-PRs| image:: 
https://img.shields.io/github/issues-pr-closed/tqdm/tqdm.svg?logo=github&logoColor=white
            :target: https://github.com/tqdm/tqdm/pulls
         .. |GitHub-Contributions| image:: 
https://img.shields.io/github/contributors/tqdm/tqdm.svg?logo=github&logoColor=white
            :target: https://github.com/tqdm/tqdm/graphs/contributors
         .. |GitHub-Updated| image:: 
https://img.shields.io/github/last-commit/tqdm/tqdm/master.svg?logo=github&logoColor=white&label=pushed
            :target: https://github.com/tqdm/tqdm/pulse
-        .. |Gift-Casper| image:: 
https://img.shields.io/badge/gift-donate-ff69b4.svg
-           :target: https://caspersci.uk.to/donate.html
+        .. |Gift-Casper| image:: 
https://img.shields.io/badge/dynamic/json.svg?color=ff69b4&label=gifts%20received&prefix=%C2%A3&query=%24..sum&url=https%3A%2F%2Fcaspersci.uk.to%2Fgifts.json
+           :target: https://caspersci.uk.to/donate
         .. |PyPI-Status| image:: https://img.shields.io/pypi/v/tqdm.svg
            :target: https://pypi.org/project/tqdm
         .. |PyPI-Downloads| image:: 
https://img.shields.io/pypi/dm/tqdm.svg?label=pypi%20downloads&logo=python&logoColor=white
            :target: https://pypi.org/project/tqdm
         .. |PyPI-Versions| image:: 
https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white
            :target: https://pypi.org/project/tqdm
-        .. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge
+        .. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge&logo=conda-forge
            :target: https://anaconda.org/conda-forge/tqdm
+        .. |Snapcraft| image:: 
https://img.shields.io/badge/snap-install-82BEA0.svg?logo=snapcraft
+           :target: https://snapcraft.io/tqdm
+        .. |Docker| image:: 
https://img.shields.io/badge/docker-pull-blue.svg?logo=docker
+           :target: https://hub.docker.com/r/tqdm/tqdm
         .. |Libraries-Rank| image:: 
https://img.shields.io/librariesio/sourcerank/pypi/tqdm.svg?logo=koding&logoColor=white
            :target: https://libraries.io/pypi/tqdm
         .. |Libraries-Dependents| image:: 
https://img.shields.io/librariesio/dependent-repos/pypi/tqdm.svg?logo=koding&logoColor=white
@@ -960,8 +1052,10 @@
            :target: https://raw.githubusercontent.com/tqdm/tqdm/master/LICENCE
         .. |DOI-URI| image:: 
https://img.shields.io/badge/DOI-10.5281/zenodo.595120-blue.svg
            :target: https://doi.org/10.5281/zenodo.595120
-        .. |interactive-demo| image:: 
https://img.shields.io/badge/demo-interactive-orange.svg?logo=jupyter
-           :target: https://notebooks.rmotr.com/demo/gh/tqdm/tqdm
+        .. |notebook-demo| image:: 
https://img.shields.io/badge/launch-notebook-orange.svg?logo=jupyter
+           :target: https://notebooks.ai/demo/gh/tqdm/tqdm
+        .. |binder-demo| image:: https://mybinder.org/badge_logo.svg
+           :target: 
https://mybinder.org/v2/gh/tqdm/tqdm/master?filepath=DEMO.ipynb
         .. |Screenshot-Jupyter1| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-1.gif
         .. |Screenshot-Jupyter2| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-2.gif
         .. |Screenshot-Jupyter3| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-3.gif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/README.rst new/tqdm-4.32.1/README.rst
--- old/tqdm-4.31.1/README.rst  2019-02-10 19:44:40.000000000 +0100
+++ new/tqdm-4.32.1/README.rst  2019-05-14 00:43:33.000000000 +0200
@@ -3,15 +3,15 @@
 tqdm
 ====
 
-|PyPI-Versions| |PyPI-Status| |Conda-Forge-Status|
+|PyPI-Versions| |PyPI-Status| |Conda-Forge-Status| |Docker| |Snapcraft|
 
 |Build-Status| |Coverage-Status| |Branch-Coverage-Status| |Codacy-Grade| 
|Libraries-Rank| |PyPI-Downloads|
 
-|DOI-URI| |LICENCE| |OpenHub-Status| |interactive-demo|
+|DOI-URI| |LICENCE| |OpenHub-Status| |binder-demo| |notebook-demo|
 
 
-``tqdm`` means "progress" in Arabic (taqadum, تقدّم)
-and is an abbreviation for "I love you so much" in Spanish (te quiero 
demasiado).
+``tqdm`` means "progress" in Arabic (*taqadum*, تقدّم)
+and is an abbreviation for "I love you so much" in Spanish (*te quiero 
demasiado*).
 
 Instantly make your loops show a smart progress meter - just wrap any
 iterable with ``tqdm(iterable)``, and you're done!
@@ -98,6 +98,24 @@
 
     conda install -c conda-forge tqdm
 
+Latest Snapcraft release
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+|Snapcraft|
+
+.. code:: sh
+
+    snap install tqdm
+
+Latest Docker release
+~~~~~~~~~~~~~~~~~~~~~
+
+|Docker|
+
+.. code:: sh
+
+    docker pull tqdm/tqdm
+    docker run -i --rm tqdm/tqdm --help
 
 Changelog
 ---------
@@ -420,28 +438,26 @@
           """
 
       def close(self):
-          """
-          Cleanup and (if leave=False) close the progressbar.
-          """
-
-      def unpause(self):
-          """
-          Restart tqdm timer from last print time.
-          """
+          """Cleanup and (if leave=False) close the progressbar."""
 
       def clear(self, nomove=False):
-          """
-          Clear current bar display
-          """
+          """Clear current bar display."""
 
       def refresh(self):
-          """
-          Force refresh the display of this bar
-          """
+          """Force refresh the display of this bar."""
 
-      def write(cls, s, file=sys.stdout, end="\n"):
+      def unpause(self):
+          """Restart tqdm timer from last print time."""
+
+      def reset(self, total=None):
           """
-          Print a message via tqdm (without overlap with bars)
+          Resets to 0 iterations for repeated use.
+
+          Consider combining with ``leave=True``.
+
+          Parameters
+          ----------
+          total  : int, optional. Total to use for the new bar.
           """
 
       def set_description(self, desc=None, refresh=True):
@@ -462,8 +478,32 @@
 
           Parameters
           ----------
+          ordered_dict  : dict or OrderedDict, optional
           refresh  : bool, optional
               Forces refresh [default: True].
+          kwargs  : dict, optional
+          """
+
+      @classmethod
+      def write(cls, s, file=sys.stdout, end="\n"):
+          """Print a message via tqdm (without overlap with bars)."""
+
+      @property
+      def format_dict(self):
+          """Public API for read-only member access."""
+
+      def display(self, msg=None, pos=None):
+          """
+          Use ``self.sp`` to display ``msg`` in the specified ``pos``.
+
+          Consider overloading this function when inheriting to use e.g.:
+          ``self.some_frontend(**self.format_dict)`` instead of ``self.sp``.
+
+          Parameters
+          ----------
+          msg  : str, optional. What to display (default: ``repr(self)``).
+          pos  : int, optional. Position to ``moveto``
+            (default: ``abs(self.pos)``).
           """
 
     def trange(*args, **kwargs):
@@ -473,24 +513,16 @@
         """
 
     class tqdm_gui(tqdm):
-        """
-        Experimental GUI version of tqdm!
-        """
+        """Experimental GUI version"""
 
     def tgrange(*args, **kwargs):
-        """
-        Experimental GUI version of trange!
-        """
+        """Experimental GUI version of trange"""
 
     class tqdm_notebook(tqdm):
-        """
-        Experimental IPython/Jupyter Notebook widget using tqdm!
-        """
+        """Experimental IPython/Jupyter Notebook widget"""
 
     def tnrange(*args, **kwargs):
-        """
-        Experimental IPython/Jupyter Notebook widget using tqdm!
-        """
+        """Experimental IPython/Jupyter Notebook widget version of trange"""
 
 
 Examples and Advanced Usage
@@ -499,11 +531,12 @@
 - See the `examples <https://github.com/tqdm/tqdm/tree/master/examples>`__
   folder;
 - import the module and run ``help()``;
-- consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__.
+- consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__;
     - this has an
       `excellent article 
<https://github.com/tqdm/tqdm/wiki/How-to-make-a-great-Progress-Bar>`__
-      on how to make a **great** progressbar, or
-- run the |interactive-demo|.
+      on how to make a **great** progressbar;
+- run the |notebook-demo| or |binder-demo|, or
+- check out the `slides from PyData London 
<https://tqdm.github.io/PyData2019/slides.html>`__.
 
 Description and additional stats
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -739,9 +772,64 @@
 Consider overloading ``display()`` to use e.g.
 ``self.frontend(**self.format_dict)`` instead of ``self.sp(repr(self))``.
 
+Dynamic Monitor/Meter
+~~~~~~~~~~~~~~~~~~~~~
+
+You can use a ``tqdm`` as a meter which is not monotonically increasing.
+This could be because ``n`` decreases (e.g. a CPU usage monitor) or ``total``
+changes.
+
+One example would be recursively searching for files. The ``total`` is the
+number of objects found so far, while ``n`` is the number of those objects 
which
+are files (rather than folders):
+
+.. code:: python
+
+    from tqdm import tqdm
+    import os.path
+
+    def find_files_recursively(path, show_progress=True):
+        files = []
+        # total=1 assumes `path` is a file
+        t = tqdm(total=1, unit="file", disable=not show_progress)
+        if not os.path.exists(path):
+            raise IOError("Cannot find:" + path)
+
+        def append_found_file(f):
+            files.append(f)
+            t.update()
+
+        def list_found_dir(path):
+            """returns os.listdir(path) assuming os.path.isdir(path)"""
+            listing = os.listdir(path)
+            # subtract 1 since a "file" we found was actually this directory
+            t.total += len(listing) - 1
+            # fancy way to give info without forcing a refresh
+            t.set_postfix(dir=path[-10:], refresh=False)
+            t.update(0)  # may trigger a refresh
+            return listing
+
+        def recursively_search(path):
+            if os.path.isdir(path):
+                for f in list_found_dir(path):
+                    recursively_search(os.path.join(path, f))
+            else:
+                append_found_file(path)
+
+        recursively_search(path)
+        t.set_postfix(dir=path)
+        t.close()
+        return files
+
+Using ``update(0)`` is a handy way to let ``tqdm`` decide when to trigger a
+display refresh to avoid console spamming.
+
 Writing messages
 ~~~~~~~~~~~~~~~~
 
+This is a work in progress (see
+`#737 <https://github.com/tqdm/tqdm/issues/737>`__).
+
 Since ``tqdm`` uses a simple printing mechanism to display progress bars,
 you should not write any message in the terminal using ``print()`` while
 a progressbar is open.
@@ -863,7 +951,7 @@
 Contributions
 -------------
 
-|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|
+|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status| 
|GitHub-Contributions|
 
 All source code is hosted on `GitHub <https://github.com/tqdm/tqdm>`__.
 Contributions are welcome.
@@ -872,6 +960,24 @@
 `CONTRIBUTING 
<https://raw.githubusercontent.com/tqdm/tqdm/master/CONTRIBUTING.md>`__
 file for more information.
 
+Developers who have made significant contributions, ranked by *LoC*
+(surviving lines of code,
+`git fame -wMC --excl '\.(png|gif|enc)$' 
<https://github.com/casperdcl/git-fame>`__),
+are:
+
+==================== ================================================== ==== 
================================
+Name                 ID                                                 LoC  
Notes
+==================== ================================================== ==== 
================================
+Casper da Costa-Luis `casperdcl <https://github.com/casperdcl>`__       ~3/4 
primary maintainer |Gift-Casper|
+Stephen Larroque     `lrq3000 <https://github.com/lrq3000>`__           ~1/6 
team member
+Noam Yorav-Raphael   `noamraph <https://github.com/noamraph>`__         ~1%  
original author
+Matthew Stevens      `mjstevens777 <https://github.com/mjstevens777>`__ ~1%
+Guangshuo Chen       `chengs <https://github.com/chengs>`__             ~1%
+Hadrien Mary         `hadim <https://github.com/hadim>`__               ~1%  
team member
+Mikhail Korobov      `kmike <https://github.com/kmike>`__               ~1%  
team member
+Kyle Altendorf       `altendky <https://github.com/altendky>`__         ~1%
+==================== ================================================== ==== 
================================
+
 Ports to Other Languages
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -886,24 +992,6 @@
 
 Citation information: |DOI-URI|
 
-
-Authors
--------
-
-The main developers, ranked by surviving lines of code
-(`git fame -wMC --excl '\.(png|gif)$' 
<https://github.com/casperdcl/git-fame>`__), are:
-
-- Casper da Costa-Luis (`casperdcl <https://github.com/casperdcl>`__, ~2/3, 
|Gift-Casper|)
-- Stephen Larroque (`lrq3000 <https://github.com/lrq3000>`__, ~1/5)
-- Matthew Stevens (`mjstevens777 <https://github.com/mjstevens777>`__, ~2%)
-- Noam Yorav-Raphael (`noamraph <https://github.com/noamraph>`__, ~2%, 
original author)
-- Guangshuo Chen (`chengs <https://github.com/chengs>`__, ~1%)
-- Hadrien Mary (`hadim <https://github.com/hadim>`__, ~1%)
-- Mikhail Korobov (`kmike <https://github.com/kmike>`__, ~1%)
-- Kyle Altendorf (`altendky <https://github.com/altendky>`__, ~1%)
-
-There are also many |GitHub-Contributions| which we are grateful for.
-
 |README-Hits| (Since 19 May 2016)
 
 .. |Logo| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif
@@ -925,23 +1013,27 @@
 .. |GitHub-Commits| image:: 
https://img.shields.io/github/commit-activity/y/tqdm/tqdm.svg?logo=git&logoColor=white
    :target: https://github.com/tqdm/tqdm/graphs/commit-activity
 .. |GitHub-Issues| image:: 
https://img.shields.io/github/issues-closed/tqdm/tqdm.svg?logo=github&logoColor=white
-   :target: https://github.com/tqdm/tqdm/issues
+   :target: https://github.com/tqdm/tqdm/issues?q=
 .. |GitHub-PRs| image:: 
https://img.shields.io/github/issues-pr-closed/tqdm/tqdm.svg?logo=github&logoColor=white
    :target: https://github.com/tqdm/tqdm/pulls
 .. |GitHub-Contributions| image:: 
https://img.shields.io/github/contributors/tqdm/tqdm.svg?logo=github&logoColor=white
    :target: https://github.com/tqdm/tqdm/graphs/contributors
 .. |GitHub-Updated| image:: 
https://img.shields.io/github/last-commit/tqdm/tqdm/master.svg?logo=github&logoColor=white&label=pushed
    :target: https://github.com/tqdm/tqdm/pulse
-.. |Gift-Casper| image:: https://img.shields.io/badge/gift-donate-ff69b4.svg
-   :target: https://caspersci.uk.to/donate.html
+.. |Gift-Casper| image:: 
https://img.shields.io/badge/dynamic/json.svg?color=ff69b4&label=gifts%20received&prefix=%C2%A3&query=%24..sum&url=https%3A%2F%2Fcaspersci.uk.to%2Fgifts.json
+   :target: https://caspersci.uk.to/donate
 .. |PyPI-Status| image:: https://img.shields.io/pypi/v/tqdm.svg
    :target: https://pypi.org/project/tqdm
 .. |PyPI-Downloads| image:: 
https://img.shields.io/pypi/dm/tqdm.svg?label=pypi%20downloads&logo=python&logoColor=white
    :target: https://pypi.org/project/tqdm
 .. |PyPI-Versions| image:: 
https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white
    :target: https://pypi.org/project/tqdm
-.. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge
+.. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge&logo=conda-forge
    :target: https://anaconda.org/conda-forge/tqdm
+.. |Snapcraft| image:: 
https://img.shields.io/badge/snap-install-82BEA0.svg?logo=snapcraft
+   :target: https://snapcraft.io/tqdm
+.. |Docker| image:: 
https://img.shields.io/badge/docker-pull-blue.svg?logo=docker
+   :target: https://hub.docker.com/r/tqdm/tqdm
 .. |Libraries-Rank| image:: 
https://img.shields.io/librariesio/sourcerank/pypi/tqdm.svg?logo=koding&logoColor=white
    :target: https://libraries.io/pypi/tqdm
 .. |Libraries-Dependents| image:: 
https://img.shields.io/librariesio/dependent-repos/pypi/tqdm.svg?logo=koding&logoColor=white
@@ -952,8 +1044,10 @@
    :target: https://raw.githubusercontent.com/tqdm/tqdm/master/LICENCE
 .. |DOI-URI| image:: 
https://img.shields.io/badge/DOI-10.5281/zenodo.595120-blue.svg
    :target: https://doi.org/10.5281/zenodo.595120
-.. |interactive-demo| image:: 
https://img.shields.io/badge/demo-interactive-orange.svg?logo=jupyter
-   :target: https://notebooks.rmotr.com/demo/gh/tqdm/tqdm
+.. |notebook-demo| image:: 
https://img.shields.io/badge/launch-notebook-orange.svg?logo=jupyter
+   :target: https://notebooks.ai/demo/gh/tqdm/tqdm
+.. |binder-demo| image:: https://mybinder.org/badge_logo.svg
+   :target: https://mybinder.org/v2/gh/tqdm/tqdm/master?filepath=DEMO.ipynb
 .. |Screenshot-Jupyter1| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-1.gif
 .. |Screenshot-Jupyter2| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-2.gif
 .. |Screenshot-Jupyter3| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-3.gif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm/_tqdm.py 
new/tqdm-4.32.1/tqdm/_tqdm.py
--- old/tqdm-4.31.1/tqdm/_tqdm.py       2019-02-10 19:44:40.000000000 +0100
+++ new/tqdm-4.32.1/tqdm/_tqdm.py       2019-05-14 00:41:59.000000000 +0200
@@ -480,7 +480,7 @@
 
     @classmethod
     def _get_free_pos(cls, instance=None):
-        """Skips specified instance"""
+        """Skips specified instance."""
         positions = set(abs(inst.pos) for inst in cls._instances
                         if inst is not instance and hasattr(inst, "pos"))
         return min(set(range(len(positions) + 1)).difference(positions))
@@ -517,9 +517,7 @@
 
     @classmethod
     def write(cls, s, file=None, end="\n", nolock=False):
-        """
-        Print a message via tqdm (without overlap with bars)
-        """
+        """Print a message via tqdm (without overlap with bars)."""
         fp = file if file is not None else sys.stdout
         with cls.external_write_mode(file=file, nolock=nolock):
             # Write the message
@@ -965,21 +963,6 @@
     def __del__(self):
         self.close()
 
-    @property
-    def format_dict(self):
-        """Public API for read-only member access"""
-        return dict(
-            n=self.n, total=self.total,
-            elapsed=self._time() - self.start_t
-            if hasattr(self, 'start_t') else 0,
-            ncols=self.dynamic_ncols(self.fp)
-            if self.dynamic_ncols else self.ncols,
-            prefix=self.desc, ascii=self.ascii, unit=self.unit,
-            unit_scale=self.unit_scale,
-            rate=1 / self.avg_time if self.avg_time else None,
-            bar_format=self.bar_format, postfix=self.postfix,
-            unit_divisor=self.unit_divisor)
-
     def __repr__(self):
         return self.format_meter(**self.format_dict)
 
@@ -1100,7 +1083,7 @@
             return
 
         if n < 0:
-            raise ValueError("n ({0}) cannot be negative".format(n))
+            self.last_print_n += n  # for auto-refresh logic to work
         self.n += n
 
         # check counter first to reduce calls to time()
@@ -1152,9 +1135,7 @@
                 self.last_print_t = cur_t
 
     def close(self):
-        """
-        Cleanup and (if leave=False) close the progressbar.
-        """
+        """Cleanup and (if leave=False) close the progressbar."""
         if self.disable:
             return
 
@@ -1195,14 +1176,53 @@
                 if not pos:
                     fp_write('\r')
 
+    def clear(self, nolock=False):
+        """Clear current bar display."""
+        if self.disable:
+            return
+
+        if not nolock:
+            self._lock.acquire()
+        self.moveto(abs(self.pos))
+        self.sp('')
+        self.fp.write('\r')  # place cursor back at the beginning of line
+        self.moveto(-abs(self.pos))
+        if not nolock:
+            self._lock.release()
+
+    def refresh(self, nolock=False):
+        """Force refresh the display of this bar."""
+        if self.disable:
+            return
+
+        if not nolock:
+            self._lock.acquire()
+        self.display()
+        if not nolock:
+            self._lock.release()
+
     def unpause(self):
-        """
-        Restart tqdm timer from last print time.
-        """
+        """Restart tqdm timer from last print time."""
         cur_t = self._time()
         self.start_t += cur_t - self.last_print_t
         self.last_print_t = cur_t
 
+    def reset(self, total=None):
+        """
+        Resets to 0 iterations for repeated use.
+
+        Consider combining with `leave=True`.
+
+        Parameters
+        ----------
+        total  : int, optional. Total to use for the new bar.
+        """
+        self.last_print_n = self.n = 0
+        self.last_print_t = self.start_t = self._time()
+        if total is not None:
+            self.total = total
+        self.refresh()
+
     def set_description(self, desc=None, refresh=True):
         """
         Set/modify description of the progress bar.
@@ -1218,9 +1238,7 @@
             self.refresh()
 
     def set_description_str(self, desc=None, refresh=True):
-        """
-        Set/modify description without ': ' appended.
-        """
+        """Set/modify description without ': ' appended."""
         self.desc = desc or ''
         if refresh:
             self.refresh()
@@ -1269,43 +1287,33 @@
         self.fp.write(_unicode('\n' * n + _term_move_up() * -n))
         self.fp.flush()
 
-    def clear(self, nolock=False):
-        """
-        Clear current bar display
-        """
-        if self.disable:
-            return
-
-        if not nolock:
-            self._lock.acquire()
-        self.moveto(abs(self.pos))
-        self.sp('')
-        self.fp.write('\r')  # place cursor back at the beginning of line
-        self.moveto(-abs(self.pos))
-        if not nolock:
-            self._lock.release()
-
-    def refresh(self, nolock=False):
-        """
-        Force refresh the display of this bar
-        """
-        if self.disable:
-            return
-
-        if not nolock:
-            self._lock.acquire()
-        self.display()
-        if not nolock:
-            self._lock.release()
+    @property
+    def format_dict(self):
+        """Public API for read-only member access."""
+        return dict(
+            n=self.n, total=self.total,
+            elapsed=self._time() - self.start_t
+            if hasattr(self, 'start_t') else 0,
+            ncols=self.dynamic_ncols(self.fp)
+            if self.dynamic_ncols else self.ncols,
+            prefix=self.desc, ascii=self.ascii, unit=self.unit,
+            unit_scale=self.unit_scale,
+            rate=1 / self.avg_time if self.avg_time else None,
+            bar_format=self.bar_format, postfix=self.postfix,
+            unit_divisor=self.unit_divisor)
 
     def display(self, msg=None, pos=None):
         """
-        Use `self.sp` and to display `msg` in the specified `pos`.
+        Use `self.sp` to display `msg` in the specified `pos`.
+
+        Consider overloading this function when inheriting to use e.g.:
+        `self.some_frontend(**self.format_dict)` instead of `self.sp`.
 
         Parameters
         ----------
-        msg  : what to display (default: repr(self))
-        pos  : position to display in. (default: abs(self.pos))
+        msg  : str, optional. What to display (default: `repr(self)`).
+        pos  : int, optional. Position to `moveto`
+          (default: `abs(self.pos)`).
         """
         if pos is None:
             pos = abs(self.pos)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm/_tqdm_notebook.py 
new/tqdm-4.32.1/tqdm/_tqdm_notebook.py
--- old/tqdm-4.31.1/tqdm/_tqdm_notebook.py      2018-10-22 19:45:19.000000000 
+0200
+++ new/tqdm-4.32.1/tqdm/_tqdm_notebook.py      2019-05-14 00:41:59.000000000 
+0200
@@ -150,7 +150,7 @@
                     npos = s.find(r'/|/')  # cause we use bar_format=r'{n}|...'
                     # Check that n can be found in s (else n > total)
                     if npos >= 0:
-                        n = int(s[:npos])  # get n from string
+                        n = float(s[:npos])  # get n from string
                         s = s[npos + 3:]  # remove from string
 
                         # Update bar with current n value
@@ -208,8 +208,10 @@
         self.ncols = '100%' if self.dynamic_ncols else kwargs.get("ncols", 
None)
 
         # Replace with IPython progress bar display (with correct total)
+        unit_scale = 1 if self.unit_scale is True else self.unit_scale or 1
+        total = self.total * unit_scale if self.total else self.total
         self.sp = self.status_printer(
-            self.fp, self.total, self.desc, self.ncols)
+            self.fp, total, self.desc, self.ncols)
         self.desc = None  # trick to place description before the bar
 
         # Print initial bar state
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm/_version.py 
new/tqdm-4.32.1/tqdm/_version.py
--- old/tqdm-4.31.1/tqdm/_version.py    2019-02-10 19:44:56.000000000 +0100
+++ new/tqdm-4.32.1/tqdm/_version.py    2019-05-14 00:41:59.000000000 +0200
@@ -5,7 +5,7 @@
 __all__ = ["__version__"]
 
 # major, minor, patch, -extra
-version_info = 4, 31, 1
+version_info = 4, 32, 1
 
 # Nice string for the version
 __version__ = '.'.join(map(str, version_info))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm/tests/tests_tqdm.py 
new/tqdm-4.32.1/tqdm/tests/tests_tqdm.py
--- old/tqdm-4.31.1/tqdm/tests/tests_tqdm.py    2019-02-10 19:44:40.000000000 
+0100
+++ new/tqdm-4.32.1/tqdm/tests/tests_tqdm.py    2019-05-14 00:41:59.000000000 
+0200
@@ -895,15 +895,9 @@
             assert '| 2/2' in our_file.getvalue()
             progressbar.desc = 'dynamically notify of 4 increments in total'
             progressbar.total = 4
-            try:
-                progressbar.update(-10)
-            except ValueError as e:
-                if str(e) != "n (-10) cannot be negative":
-                    raise
-                progressbar.update()  # should default to +1
-            else:
-                raise ValueError("Should not support negative updates")
-            res = our_file.getvalue()
+            progressbar.update(-1)
+            progressbar.update(2)
+        res = our_file.getvalue()
     assert '| 3/4 ' in res
     assert 'dynamically notify of 4 increments in total' in res
 
@@ -1133,6 +1127,21 @@
 
 
 @with_setup(pretest, posttest)
+def test_reset():
+    """Test resetting a bar for re-use"""
+    with closing(StringIO()) as our_file:
+        with tqdm(total=10, file=our_file,
+                  miniters=1, mininterval=0, maxinterval=0) as t:
+            t.update(9)
+            t.reset()
+            t.update()
+            t.reset(total=12)
+            t.update(10)
+        assert '| 1/10' in our_file.getvalue()
+        assert '| 10/12' in our_file.getvalue()
+
+
+@with_setup(pretest, posttest)
 def test_position():
     """Test positioned progress bars"""
     if nt_and_no_colorama:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm/tqdm.1 new/tqdm-4.32.1/tqdm/tqdm.1
--- old/tqdm-4.31.1/tqdm/tqdm.1 2019-01-25 22:03:17.000000000 +0100
+++ new/tqdm-4.32.1/tqdm/tqdm.1 2019-05-14 00:41:59.000000000 +0200
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 1.19
+.\" Automatically generated by Pandoc 1.19.2
 .\"
-.TH "TQDM" "1" "2015\-2018" "tqdm User Manuals" ""
+.TH "TQDM" "1" "2015\-2019" "tqdm User Manuals" ""
 .hy
 .SH NAME
 .PP
@@ -110,9 +110,9 @@
 .RE
 .TP
 .B \-\-ascii=\f[I]ascii\f[]
-bool, optional.
+bool or str, optional.
 If unspecified or False, use unicode (smooth blocks) to fill the meter.
-The fallback is to use ASCII characters \f[C]1\-9\ #\f[].
+The fallback is to use ASCII characters " 123456789#".
 .RS
 .RE
 .TP
@@ -164,7 +164,7 @@
 [{elapsed}<{remaining}, \[aq] \[aq]{rate_fmt}{postfix}]\[aq] Possible
 vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, percentage, rate,
 rate_fmt, rate_noinv, rate_noinv_fmt, rate_inv, rate_inv_fmt, elapsed,
-remaining, desc, postfix.
+elapsed_s, remaining, remaining_s, desc, postfix, unit.
 Note that a trailing ": " is automatically removed after {desc} if the
 latter is empty.
 .RS
@@ -198,6 +198,15 @@
 .RS
 .RE
 .TP
+.B \-\-write_bytes=\f[I]write_bytes\f[]
+bool, optional.
+If (default: None) and \f[C]file\f[] is unspecified, bytes will be
+written in Python 2.
+If \f[C]True\f[] will also write bytes.
+In all other cases will default to unicode.
+.RS
+.RE
+.TP
 .B \-\-delim=\f[I]delim\f[]
 chr, optional.
 Delimiting character [default: \[aq]\\n\[aq]].
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.31.1/tqdm.egg-info/PKG-INFO 
new/tqdm-4.32.1/tqdm.egg-info/PKG-INFO
--- old/tqdm-4.31.1/tqdm.egg-info/PKG-INFO      2019-02-10 20:01:19.000000000 
+0100
+++ new/tqdm-4.32.1/tqdm.egg-info/PKG-INFO      2019-05-14 00:43:35.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: tqdm
-Version: 4.31.1
+Version: 4.32.1
 Summary: Fast, Extensible Progress Meter
 Home-page: https://github.com/tqdm/tqdm
 Maintainer: tqdm developers
@@ -11,15 +11,15 @@
         tqdm
         ====
         
-        |PyPI-Versions| |PyPI-Status| |Conda-Forge-Status|
+        |PyPI-Versions| |PyPI-Status| |Conda-Forge-Status| |Docker| |Snapcraft|
         
         |Build-Status| |Coverage-Status| |Branch-Coverage-Status| 
|Codacy-Grade| |Libraries-Rank| |PyPI-Downloads|
         
-        |DOI-URI| |LICENCE| |OpenHub-Status| |interactive-demo|
+        |DOI-URI| |LICENCE| |OpenHub-Status| |binder-demo| |notebook-demo|
         
         
-        ``tqdm`` means "progress" in Arabic (taqadum, تقدّم)
-        and is an abbreviation for "I love you so much" in Spanish (te quiero 
demasiado).
+        ``tqdm`` means "progress" in Arabic (*taqadum*, تقدّم)
+        and is an abbreviation for "I love you so much" in Spanish (*te quiero 
demasiado*).
         
         Instantly make your loops show a smart progress meter - just wrap any
         iterable with ``tqdm(iterable)``, and you're done!
@@ -106,6 +106,24 @@
         
             conda install -c conda-forge tqdm
         
+        Latest Snapcraft release
+        ~~~~~~~~~~~~~~~~~~~~~~~~
+        
+        |Snapcraft|
+        
+        .. code:: sh
+        
+            snap install tqdm
+        
+        Latest Docker release
+        ~~~~~~~~~~~~~~~~~~~~~
+        
+        |Docker|
+        
+        .. code:: sh
+        
+            docker pull tqdm/tqdm
+            docker run -i --rm tqdm/tqdm --help
         
         Changelog
         ---------
@@ -428,28 +446,26 @@
                   """
         
               def close(self):
-                  """
-                  Cleanup and (if leave=False) close the progressbar.
-                  """
-        
-              def unpause(self):
-                  """
-                  Restart tqdm timer from last print time.
-                  """
+                  """Cleanup and (if leave=False) close the progressbar."""
         
               def clear(self, nomove=False):
-                  """
-                  Clear current bar display
-                  """
+                  """Clear current bar display."""
         
               def refresh(self):
-                  """
-                  Force refresh the display of this bar
-                  """
+                  """Force refresh the display of this bar."""
         
-              def write(cls, s, file=sys.stdout, end="\n"):
+              def unpause(self):
+                  """Restart tqdm timer from last print time."""
+        
+              def reset(self, total=None):
                   """
-                  Print a message via tqdm (without overlap with bars)
+                  Resets to 0 iterations for repeated use.
+        
+                  Consider combining with ``leave=True``.
+        
+                  Parameters
+                  ----------
+                  total  : int, optional. Total to use for the new bar.
                   """
         
               def set_description(self, desc=None, refresh=True):
@@ -470,8 +486,32 @@
         
                   Parameters
                   ----------
+                  ordered_dict  : dict or OrderedDict, optional
                   refresh  : bool, optional
                       Forces refresh [default: True].
+                  kwargs  : dict, optional
+                  """
+        
+              @classmethod
+              def write(cls, s, file=sys.stdout, end="\n"):
+                  """Print a message via tqdm (without overlap with bars)."""
+        
+              @property
+              def format_dict(self):
+                  """Public API for read-only member access."""
+        
+              def display(self, msg=None, pos=None):
+                  """
+                  Use ``self.sp`` to display ``msg`` in the specified ``pos``.
+        
+                  Consider overloading this function when inheriting to use 
e.g.:
+                  ``self.some_frontend(**self.format_dict)`` instead of 
``self.sp``.
+        
+                  Parameters
+                  ----------
+                  msg  : str, optional. What to display (default: 
``repr(self)``).
+                  pos  : int, optional. Position to ``moveto``
+                    (default: ``abs(self.pos)``).
                   """
         
             def trange(*args, **kwargs):
@@ -481,24 +521,16 @@
                 """
         
             class tqdm_gui(tqdm):
-                """
-                Experimental GUI version of tqdm!
-                """
+                """Experimental GUI version"""
         
             def tgrange(*args, **kwargs):
-                """
-                Experimental GUI version of trange!
-                """
+                """Experimental GUI version of trange"""
         
             class tqdm_notebook(tqdm):
-                """
-                Experimental IPython/Jupyter Notebook widget using tqdm!
-                """
+                """Experimental IPython/Jupyter Notebook widget"""
         
             def tnrange(*args, **kwargs):
-                """
-                Experimental IPython/Jupyter Notebook widget using tqdm!
-                """
+                """Experimental IPython/Jupyter Notebook widget version of 
trange"""
         
         
         Examples and Advanced Usage
@@ -507,11 +539,12 @@
         - See the `examples 
<https://github.com/tqdm/tqdm/tree/master/examples>`__
           folder;
         - import the module and run ``help()``;
-        - consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__.
+        - consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__;
             - this has an
               `excellent article 
<https://github.com/tqdm/tqdm/wiki/How-to-make-a-great-Progress-Bar>`__
-              on how to make a **great** progressbar, or
-        - run the |interactive-demo|.
+              on how to make a **great** progressbar;
+        - run the |notebook-demo| or |binder-demo|, or
+        - check out the `slides from PyData London 
<https://tqdm.github.io/PyData2019/slides.html>`__.
         
         Description and additional stats
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -747,9 +780,64 @@
         Consider overloading ``display()`` to use e.g.
         ``self.frontend(**self.format_dict)`` instead of 
``self.sp(repr(self))``.
         
+        Dynamic Monitor/Meter
+        ~~~~~~~~~~~~~~~~~~~~~
+        
+        You can use a ``tqdm`` as a meter which is not monotonically 
increasing.
+        This could be because ``n`` decreases (e.g. a CPU usage monitor) or 
``total``
+        changes.
+        
+        One example would be recursively searching for files. The ``total`` is 
the
+        number of objects found so far, while ``n`` is the number of those 
objects which
+        are files (rather than folders):
+        
+        .. code:: python
+        
+            from tqdm import tqdm
+            import os.path
+        
+            def find_files_recursively(path, show_progress=True):
+                files = []
+                # total=1 assumes `path` is a file
+                t = tqdm(total=1, unit="file", disable=not show_progress)
+                if not os.path.exists(path):
+                    raise IOError("Cannot find:" + path)
+        
+                def append_found_file(f):
+                    files.append(f)
+                    t.update()
+        
+                def list_found_dir(path):
+                    """returns os.listdir(path) assuming os.path.isdir(path)"""
+                    listing = os.listdir(path)
+                    # subtract 1 since a "file" we found was actually this 
directory
+                    t.total += len(listing) - 1
+                    # fancy way to give info without forcing a refresh
+                    t.set_postfix(dir=path[-10:], refresh=False)
+                    t.update(0)  # may trigger a refresh
+                    return listing
+        
+                def recursively_search(path):
+                    if os.path.isdir(path):
+                        for f in list_found_dir(path):
+                            recursively_search(os.path.join(path, f))
+                    else:
+                        append_found_file(path)
+        
+                recursively_search(path)
+                t.set_postfix(dir=path)
+                t.close()
+                return files
+        
+        Using ``update(0)`` is a handy way to let ``tqdm`` decide when to 
trigger a
+        display refresh to avoid console spamming.
+        
         Writing messages
         ~~~~~~~~~~~~~~~~
         
+        This is a work in progress (see
+        `#737 <https://github.com/tqdm/tqdm/issues/737>`__).
+        
         Since ``tqdm`` uses a simple printing mechanism to display progress 
bars,
         you should not write any message in the terminal using ``print()`` 
while
         a progressbar is open.
@@ -871,7 +959,7 @@
         Contributions
         -------------
         
-        |GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|
+        |GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status| 
|GitHub-Contributions|
         
         All source code is hosted on `GitHub <https://github.com/tqdm/tqdm>`__.
         Contributions are welcome.
@@ -880,6 +968,24 @@
         `CONTRIBUTING 
<https://raw.githubusercontent.com/tqdm/tqdm/master/CONTRIBUTING.md>`__
         file for more information.
         
+        Developers who have made significant contributions, ranked by *LoC*
+        (surviving lines of code,
+        `git fame -wMC --excl '\.(png|gif|enc)$' 
<https://github.com/casperdcl/git-fame>`__),
+        are:
+        
+        ==================== 
================================================== ==== 
================================
+        Name                 ID                                                
 LoC  Notes
+        ==================== 
================================================== ==== 
================================
+        Casper da Costa-Luis `casperdcl <https://github.com/casperdcl>`__      
 ~3/4 primary maintainer |Gift-Casper|
+        Stephen Larroque     `lrq3000 <https://github.com/lrq3000>`__          
 ~1/6 team member
+        Noam Yorav-Raphael   `noamraph <https://github.com/noamraph>`__        
 ~1%  original author
+        Matthew Stevens      `mjstevens777 
<https://github.com/mjstevens777>`__ ~1%
+        Guangshuo Chen       `chengs <https://github.com/chengs>`__            
 ~1%
+        Hadrien Mary         `hadim <https://github.com/hadim>`__              
 ~1%  team member
+        Mikhail Korobov      `kmike <https://github.com/kmike>`__              
 ~1%  team member
+        Kyle Altendorf       `altendky <https://github.com/altendky>`__        
 ~1%
+        ==================== 
================================================== ==== 
================================
+        
         Ports to Other Languages
         ~~~~~~~~~~~~~~~~~~~~~~~~
         
@@ -894,24 +1000,6 @@
         
         Citation information: |DOI-URI|
         
-        
-        Authors
-        -------
-        
-        The main developers, ranked by surviving lines of code
-        (`git fame -wMC --excl '\.(png|gif)$' 
<https://github.com/casperdcl/git-fame>`__), are:
-        
-        - Casper da Costa-Luis (`casperdcl <https://github.com/casperdcl>`__, 
~2/3, |Gift-Casper|)
-        - Stephen Larroque (`lrq3000 <https://github.com/lrq3000>`__, ~1/5)
-        - Matthew Stevens (`mjstevens777 <https://github.com/mjstevens777>`__, 
~2%)
-        - Noam Yorav-Raphael (`noamraph <https://github.com/noamraph>`__, ~2%, 
original author)
-        - Guangshuo Chen (`chengs <https://github.com/chengs>`__, ~1%)
-        - Hadrien Mary (`hadim <https://github.com/hadim>`__, ~1%)
-        - Mikhail Korobov (`kmike <https://github.com/kmike>`__, ~1%)
-        - Kyle Altendorf (`altendky <https://github.com/altendky>`__, ~1%)
-        
-        There are also many |GitHub-Contributions| which we are grateful for.
-        
         |README-Hits| (Since 19 May 2016)
         
         .. |Logo| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif
@@ -933,23 +1021,27 @@
         .. |GitHub-Commits| image:: 
https://img.shields.io/github/commit-activity/y/tqdm/tqdm.svg?logo=git&logoColor=white
            :target: https://github.com/tqdm/tqdm/graphs/commit-activity
         .. |GitHub-Issues| image:: 
https://img.shields.io/github/issues-closed/tqdm/tqdm.svg?logo=github&logoColor=white
-           :target: https://github.com/tqdm/tqdm/issues
+           :target: https://github.com/tqdm/tqdm/issues?q=
         .. |GitHub-PRs| image:: 
https://img.shields.io/github/issues-pr-closed/tqdm/tqdm.svg?logo=github&logoColor=white
            :target: https://github.com/tqdm/tqdm/pulls
         .. |GitHub-Contributions| image:: 
https://img.shields.io/github/contributors/tqdm/tqdm.svg?logo=github&logoColor=white
            :target: https://github.com/tqdm/tqdm/graphs/contributors
         .. |GitHub-Updated| image:: 
https://img.shields.io/github/last-commit/tqdm/tqdm/master.svg?logo=github&logoColor=white&label=pushed
            :target: https://github.com/tqdm/tqdm/pulse
-        .. |Gift-Casper| image:: 
https://img.shields.io/badge/gift-donate-ff69b4.svg
-           :target: https://caspersci.uk.to/donate.html
+        .. |Gift-Casper| image:: 
https://img.shields.io/badge/dynamic/json.svg?color=ff69b4&label=gifts%20received&prefix=%C2%A3&query=%24..sum&url=https%3A%2F%2Fcaspersci.uk.to%2Fgifts.json
+           :target: https://caspersci.uk.to/donate
         .. |PyPI-Status| image:: https://img.shields.io/pypi/v/tqdm.svg
            :target: https://pypi.org/project/tqdm
         .. |PyPI-Downloads| image:: 
https://img.shields.io/pypi/dm/tqdm.svg?label=pypi%20downloads&logo=python&logoColor=white
            :target: https://pypi.org/project/tqdm
         .. |PyPI-Versions| image:: 
https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white
            :target: https://pypi.org/project/tqdm
-        .. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge
+        .. |Conda-Forge-Status| image:: 
https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge&logo=conda-forge
            :target: https://anaconda.org/conda-forge/tqdm
+        .. |Snapcraft| image:: 
https://img.shields.io/badge/snap-install-82BEA0.svg?logo=snapcraft
+           :target: https://snapcraft.io/tqdm
+        .. |Docker| image:: 
https://img.shields.io/badge/docker-pull-blue.svg?logo=docker
+           :target: https://hub.docker.com/r/tqdm/tqdm
         .. |Libraries-Rank| image:: 
https://img.shields.io/librariesio/sourcerank/pypi/tqdm.svg?logo=koding&logoColor=white
            :target: https://libraries.io/pypi/tqdm
         .. |Libraries-Dependents| image:: 
https://img.shields.io/librariesio/dependent-repos/pypi/tqdm.svg?logo=koding&logoColor=white
@@ -960,8 +1052,10 @@
            :target: https://raw.githubusercontent.com/tqdm/tqdm/master/LICENCE
         .. |DOI-URI| image:: 
https://img.shields.io/badge/DOI-10.5281/zenodo.595120-blue.svg
            :target: https://doi.org/10.5281/zenodo.595120
-        .. |interactive-demo| image:: 
https://img.shields.io/badge/demo-interactive-orange.svg?logo=jupyter
-           :target: https://notebooks.rmotr.com/demo/gh/tqdm/tqdm
+        .. |notebook-demo| image:: 
https://img.shields.io/badge/launch-notebook-orange.svg?logo=jupyter
+           :target: https://notebooks.ai/demo/gh/tqdm/tqdm
+        .. |binder-demo| image:: https://mybinder.org/badge_logo.svg
+           :target: 
https://mybinder.org/v2/gh/tqdm/tqdm/master?filepath=DEMO.ipynb
         .. |Screenshot-Jupyter1| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-1.gif
         .. |Screenshot-Jupyter2| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-2.gif
         .. |Screenshot-Jupyter3| image:: 
https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-3.gif


Reply via email to