django-tqdm 1.3.1
Fast, Extensible Progress Meter (tqdm) For Django
License: MIT
Requires Python: >=3.7
Keywords: progressbar progressmeter progress bar meter rate eta console terminal time

django-tqdm
==============

|PyPI-Status| |PyPI-Versions| |LICENSE| |Tests| |Codecov| |Requirements| |Downloads|

*Fast, Extensible Progress Meter (tqdm) For Django*.

| Use tqdm_ in Django_ management commands seamlessly.
| It provides simple universal commands for Django management command to output
  text using standard command functions and tqdm.
| Only currently supported versions of Django and Python are supported.

Usage
-----

.. code:: python

    from django_tqdm import BaseCommand
    from time import sleep

    class Command(BaseCommand):
        def handle(self, *args, **options):
            # Output directly
            self.error("Error")
            self.info("Info")

            # Output through tqdm
            t = self.tqdm(total=50)
            for x in range(50):
                sleep(0.03)
                t.update(1)

                if x == 10:
                    t.info("X = 10")
                if x == 20:
                    t.error("X = 20")

Advanced:

.. code:: python

    info(text, ending="\n", fatal=False)
    error(text, ending="\n", fatal=False)
    write(text, ending="\n", fatal=False, error=False)

If you set ``fatal`` to ``True`` it will terminate the command after printing the message.

For documentation on tqdm see tqdm_.

Comparison
------------

In django-tqdm:

.. code:: python

    self.info("info")
    self.error("error")

In vanilla Django:

.. code:: python

    self.stdout.write("info")
    self.stderr.write("error")


Demos
------------

Demo 1 - Simple usage
------------------------

.. code:: python

    self.info("info")
    self.error("error")

|Demo1|

Demo 2 - tqdm usage
-----------------------

.. code:: python

    t = self.tqdm(total=50)
    for x in range(50):
        sleep(0.02)
        t.update(1)
        if x == 10:
            t.info("info")
        if x == 40:
            t.error("error")

|Demo2|

Demo 3 - Vanilla tqdm with default settings for comparison
------------------------------------------------------------------

.. code:: python

    t = tqdm(total=50)
    for x in range(50):
        sleep(0.02)
        t.update(1)
        if x == 25:
            t.write("info")
        if x == 40:
            t.write("error", file=sys.stderr)

|Demo3|


Developer documentation
-------------------------

Read `developer documentation`_.


.. |Demo1| image:: https://asciinema.org/a/117133.png
   :target: https://asciinema.org/a/117133

.. |Demo2| image:: https://asciinema.org/a/117136.png
   :target: https://asciinema.org/a/117136

.. |Demo3| image:: https://asciinema.org/a/117137.png
   :target: https://asciinema.org/a/117137

.. |PyPI-Status| image:: https://img.shields.io/pypi/v/django-tqdm.svg
   :target: https://pypi.python.org/pypi/django-tqdm

.. |PyPI-Versions| image:: https://img.shields.io/pypi/pyversions/django-tqdm.svg
   :target: https://pypi.python.org/pypi/django-tqdm

.. |LICENSE| image:: https://img.shields.io/pypi/l/django-tqdm.svg
   :target: https://raw.githubusercontent.com/desecho/django-tqdm/master/LICENSE

.. |Tests| image:: https://github.com/desecho/django-tqdm/actions/workflows/test.yaml/badge.svg?branch=master
    :target: https://github.com/desecho/django-tqdm/actions/workflows/test.yaml

.. |Codecov| image:: https://codecov.io/gh/desecho/django-tqdm/branch/master/graph/badge.svg
    :target: https://codecov.io/gh/desecho/django-tqdm

.. |Requirements| image:: https://requires.io/github/desecho/django-tqdm/requirements.svg?branch=master
     :target: https://requires.io/github/desecho/django-tqdm/requirements/?branch=master
     :alt: Requirements Status

.. |Downloads| image:: https://pepy.tech/badge/django-tqdm
     :target: https://pepy.tech/project/django-tqdm
     :alt: Downloads

.. _tqdm: https://github.com/tqdm/tqdm
.. _Django: https://www.djangoproject.com
.. _developer documentation: https://github.com/desecho/django-tqdm/blob/master/developer_doc.md