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", - "[](https://pypi.org/project/tqdm)|[](https://pypi.org/project/tqdm)|[](https://anaconda.org/conda-forge/tqdm)\n", - "-|-|-\n", + "[](https://pypi.org/project/tqdm)|[](https://pypi.org/project/tqdm)|[](https://anaconda.org/conda-forge/tqdm)|[](https://snapcraft.io/tqdm)\n", + "-|-|-|-\n", "\n", "[](https://travis-ci.org/tqdm/tqdm)|[](https://coveralls.io/github/tqdm/tqdm)|[](https://codecov.io/gh/tqdm/tqdm)|[](https://www.codacy.com/app/tqdm/tqdm?utm_source=github.com&utm_medium=referral&utm_content=tqdm/tqdm&utm_campaign=Badge_Grade)|[](https://libraries.io/pypi/tqdm)|[](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
