yaspin


Nameyaspin JSON
Version 3.1.0 PyPI version JSON
download
home_pagehttps://github.com/pavdmyt/yaspin
SummaryYet Another Terminal Spinner
upload_time2024-09-22 17:07:09
maintainerNone
docs_urlNone
authorPavlo Dmytrenko
requires_python<4.0,>=3.9
licenseMIT
keywords spinner console terminal loader indicator
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            |Logo|

=====================================================================
``yaspin``: **Y**\ et **A**\ nother Terminal **Spin**\ ner for Python
=====================================================================

|Coverage| |pypi| |black-fmt|

|Versions| |Wheel| |Examples|

|DownloadsTot| |DownloadsW|


``Yaspin`` provides a full-featured terminal spinner to show the progress during long-hanging operations.

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/demo.gif

It is easy to integrate into existing codebase by using it as a `context manager`_
or as a function `decorator`_:

.. code:: python

    import time
    from yaspin import yaspin

    # Context manager:
    with yaspin():
        time.sleep(3)  # time consuming code

    # Function decorator:
    @yaspin(text="Loading...")
    def some_operations():
        time.sleep(3)  # time consuming code

    some_operations()


**Yaspin** also provides an intuitive and powerful API. For example, you can easily summon a shark:

.. code:: python

    import time
    from yaspin import yaspin

    with yaspin().white.bold.shark.on_blue as sp:
        sp.text = "White bold shark in a blue sea"
        time.sleep(5)

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/shark.gif


Features
--------

- Runs at all major **CPython** versions (*3.9*, *3.10*, *3.11*, *3.12*, *3.13*), **PyPy**
- Supports all (70+) spinners from `cli-spinners`_
- Supports all *colors*, *highlights*, *attributes* and their mixes from `termcolor`_ library
- Easy to combine with other command-line libraries, e.g. `prompt-toolkit`_
- Flexible API, easy to integrate with existing code
- User-friendly API for handling POSIX `signals`_
- Safe **pipes** and **redirects**:

.. code-block:: bash

    $ python script_that_uses_yaspin.py > script.log
    $ python script_that_uses_yaspin.py | grep ERROR


Installation
------------

From `PyPI`_ using ``pip`` package manager:

.. code-block:: bash

    pip install --upgrade yaspin


Or install the latest sources from GitHub:

.. code-block:: bash

    pip install https://github.com/pavdmyt/yaspin/archive/master.zip


Usage
-----

Basic Example
/////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/basic_example.gif

.. code:: python

    import time
    from random import randint
    from yaspin import yaspin

    with yaspin(text="Loading", color="yellow") as spinner:
        time.sleep(2)  # time consuming code

        success = randint(0, 1)
        if success:
            spinner.ok("✅ ")
        else:
            spinner.fail("💥 ")


It is also possible to control spinner manually:

.. code:: python

    import time
    from yaspin import yaspin

    spinner = yaspin()
    spinner.start()

    time.sleep(3)  # time consuming tasks

    spinner.stop()


Run any spinner from `cli-spinners`_
////////////////////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/cli_spinners.gif

.. code:: python

    import time
    from yaspin import yaspin
    from yaspin.spinners import Spinners

    with yaspin(Spinners.earth, text="Earth") as sp:
        time.sleep(2)                # time consuming code

        # change spinner
        sp.spinner = Spinners.moon
        sp.text = "Moon"

        time.sleep(2)                # time consuming code


Any Colour You Like `🌈`_
/////////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/basic_colors.gif

.. code:: python

    import time
    from yaspin import yaspin

    with yaspin(text="Colors!") as sp:
        # Support all basic termcolor text colors
        colors = ("red", "green", "yellow", "blue", "magenta", "cyan", "white")

        for color in colors:
            sp.color, sp.text = color, color
            time.sleep(1)


Advanced colors usage
/////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/advanced_colors.gif

.. code:: python

    import time
    from yaspin import yaspin
    from yaspin.spinners import Spinners

    text = "Bold blink magenta spinner on cyan color"
    with yaspin().bold.blink.magenta.bouncingBall.on_cyan as sp:
        sp.text = text
        time.sleep(3)

    # The same result can be achieved by passing arguments directly
    with yaspin(
        Spinners.bouncingBall,
        color="magenta",
        on_color="on_cyan",
        attrs=["bold", "blink"],
    ) as sp:
        sp.text = text
        time.sleep(3)


Run any spinner you want
////////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/custom_spinners.gif

.. code:: python

    import time
    from yaspin import yaspin, Spinner

    # Compose new spinners with custom frame sequence and interval value
    sp = Spinner(["😸", "😹", "😺", "😻", "😼", "😽", "😾", "😿", "🙀"], 200)

    with yaspin(sp, text="Cat!"):
        time.sleep(3)  # cat consuming code :)


Change spinner properties on the fly
////////////////////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/sp_properties.gif

.. code:: python

    import time
    from yaspin import yaspin
    from yaspin.spinners import Spinners

    with yaspin(Spinners.noise, text="Noise spinner") as sp:
        time.sleep(2)

        sp.spinner = Spinners.arc  # spinner type
        sp.text = "Arc spinner"    # text along with spinner
        sp.color = "green"         # spinner color
        sp.side = "right"          # put spinner to the right
        sp.reversal = True         # reverse spin direction

        time.sleep(2)


Spinner with timer
//////////////////

.. code:: python

    import time
    from yaspin import yaspin

    with yaspin(text="elapsed time", timer=True) as sp:
        time.sleep(3.1415)
        sp.ok()

Custom Ellipsis
///////////////

If the text does not fit in the terminal it gets truncated, you can set a custom ellipsis to signal truncation.

.. code:: python

   import time
   from yaspin import yaspin

   with yaspin(text="some long text", ellipsis="...") as sp:
        time.sleep(2)

Dynamic text
////////////

.. code:: python

    import time
    from datetime import datetime
    from yaspin import yaspin

    class TimedText:
        def __init__(self, text):
            self.text = text
            self._start = datetime.now()

        def __str__(self):
            now = datetime.now()
            delta = now - self._start
            return f"{self.text} ({round(delta.total_seconds(), 1)}s)"

    with yaspin(text=TimedText("time passed:")):
        time.sleep(3)


Writing messages
////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/write_text.gif

You should not write any message in the terminal using ``print`` while spinner is open.
To write messages in the terminal without any collision with ``yaspin`` spinner, a ``.write()`` method is provided:

.. code:: python

    import time
    from yaspin import yaspin

    with yaspin(text="Downloading images", color="cyan") as sp:
        # task 1
        time.sleep(1)
        sp.write("> image 1 download complete")

        # task 2
        time.sleep(2)
        sp.write("> image 2 download complete")

        # finalize
        sp.ok("✔")


Integration with other libraries
////////////////////////////////

.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/hide_show.gif

Utilizing ``hidden`` context manager it is possible to toggle the display of
the spinner in order to call custom methods that write to the terminal. This is
helpful for allowing easy usage in other frameworks like `prompt-toolkit`_.
Using the powerful ``print_formatted_text`` function allows you even to apply
HTML formats and CSS styles to the output:

.. code:: python

    import sys
    import time

    from yaspin import yaspin
    from prompt_toolkit import HTML, print_formatted_text
    from prompt_toolkit.styles import Style

    # override print with feature-rich ``print_formatted_text`` from prompt_toolkit
    print = print_formatted_text

    # build a basic prompt_toolkit style for styling the HTML wrapped text
    style = Style.from_dict({
        'msg': '#4caf50 bold',
        'sub-msg': '#616161 italic'
    })


    with yaspin(text='Downloading images') as sp:
        # task 1
        time.sleep(1)
        with sp.hidden():
            print(HTML(
                u'<b>></b> <msg>image 1</msg> <sub-msg>download complete</sub-msg>'
            ), style=style)

        # task 2
        time.sleep(2)
        with sp.hidden():
            print(HTML(
                u'<b>></b> <msg>image 2</msg> <sub-msg>download complete</sub-msg>'
            ), style=style)

        # finalize
        sp.ok()


Handling POSIX `signals`_
/////////////////////////

Handling keyboard interrupts (pressing Control-C):

.. code:: python

    import time

    from yaspin import kbi_safe_yaspin


    with kbi_safe_yaspin(text="Press Control+C to send SIGINT (Keyboard Interrupt) signal"):
        time.sleep(5)  # time consuming code


Handling other types of signals:

.. code:: python

    import os
    import time
    from signal import SIGTERM, SIGUSR1

    from yaspin import yaspin
    from yaspin.signal_handlers import default_handler, fancy_handler


    sigmap = {SIGUSR1: default_handler, SIGTERM: fancy_handler}
    with yaspin(sigmap=sigmap, text="Handling SIGUSR1 and SIGTERM signals") as sp:
        sp.write("Send signals using `kill` command")
        sp.write("E.g. $ kill -USR1 {0}".format(os.getpid()))
        time.sleep(20)  # time consuming code


More `examples`_.


Development
-----------

Clone the repository:

.. code-block:: bash

    git clone https://github.com/pavdmyt/yaspin.git


Install dev dependencies:

.. code-block:: bash

    poetry install

    # if you don't have poetry installed:
    pip install -r requirements.txt


Lint code:

.. code-block:: bash

    make lint


Format code:

.. code-block:: bash

    make black-fmt


Run tests:

.. code-block:: bash

    make test


Contributing
------------

1. Fork it!
2. Create your feature branch: ``git checkout -b my-new-feature``
3. Commit your changes: ``git commit -m 'Add some feature'``
4. Push to the branch: ``git push origin my-new-feature``
5. Submit a pull request
6. Make sure tests are passing


License
-------

* MIT - Pavlo Dmytrenko; https://twitter.com/pavdmyt
* Contains data from `cli-spinners`_: MIT License, Copyright (c) Sindre Sorhus sindresorhus@gmail.com (sindresorhus.com)


.. |Logo| image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/static/logo_80.png
   :alt: yaspin Logo
.. |Coverage| image:: https://codecov.io/gh/pavdmyt/yaspin/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/pavdmyt/yaspin
.. |pypi| image:: https://img.shields.io/pypi/v/yaspin.svg
   :target: https://pypi.org/project/yaspin/
.. |Versions| image:: https://img.shields.io/pypi/pyversions/yaspin.svg
   :target: https://pypi.org/project/yaspin/
.. |Wheel| image:: https://img.shields.io/pypi/wheel/yaspin.svg
   :target: https://pypi.org/project/yaspin/
.. |Examples| image:: https://img.shields.io/badge/learn%20by-examples-0077b3.svg
   :target: https://github.com/pavdmyt/yaspin/tree/master/examples
.. |black-fmt| image:: https://img.shields.io/badge/code%20style-black-000000.svg
   :target: https://github.com/ambv/black
.. |DownloadsTot| image:: https://static.pepy.tech/badge/yaspin
   :target: https://pepy.tech/project/yaspin
.. |DownloadsW| image:: https://static.pepy.tech/badge/yaspin/week
   :target: https://pepy.tech/project/yaspin


.. _context manager: https://docs.python.org/3/reference/datamodel.html#context-managers
.. _decorator: https://www.thecodeship.com/patterns/guide-to-python-function-decorators/
.. _cli-spinners: https://github.com/sindresorhus/cli-spinners
.. _termcolor: https://pypi.org/project/termcolor/
.. _PyPI: https://pypi.org/
.. _🌈: https://en.wikipedia.org/wiki/Any_Colour_You_Like
.. _examples: https://github.com/pavdmyt/yaspin/tree/master/examples
.. _prompt-toolkit: https://github.com/jonathanslenders/python-prompt-toolkit/
.. _signals: https://www.computerhope.com/unix/signals.htm

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/pavdmyt/yaspin",
    "name": "yaspin",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.9",
    "maintainer_email": null,
    "keywords": "spinner, console, terminal, loader, indicator",
    "author": "Pavlo Dmytrenko",
    "author_email": "pavdmyt@aiven.io",
    "download_url": "https://files.pythonhosted.org/packages/07/3c/70df5034e6712fcc238b76f6afd1871de143a2a124d80ae2c377cde180f3/yaspin-3.1.0.tar.gz",
    "platform": null,
    "description": "|Logo|\n\n=====================================================================\n``yaspin``: **Y**\\ et **A**\\ nother Terminal **Spin**\\ ner for Python\n=====================================================================\n\n|Coverage| |pypi| |black-fmt|\n\n|Versions| |Wheel| |Examples|\n\n|DownloadsTot| |DownloadsW|\n\n\n``Yaspin`` provides a full-featured terminal spinner to show the progress during long-hanging operations.\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/demo.gif\n\nIt is easy to integrate into existing codebase by using it as a `context manager`_\nor as a function `decorator`_:\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    # Context manager:\n    with yaspin():\n        time.sleep(3)  # time consuming code\n\n    # Function decorator:\n    @yaspin(text=\"Loading...\")\n    def some_operations():\n        time.sleep(3)  # time consuming code\n\n    some_operations()\n\n\n**Yaspin** also provides an intuitive and powerful API. For example, you can easily summon a shark:\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    with yaspin().white.bold.shark.on_blue as sp:\n        sp.text = \"White bold shark in a blue sea\"\n        time.sleep(5)\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/shark.gif\n\n\nFeatures\n--------\n\n- Runs at all major **CPython** versions (*3.9*, *3.10*, *3.11*, *3.12*, *3.13*), **PyPy**\n- Supports all (70+) spinners from `cli-spinners`_\n- Supports all *colors*, *highlights*, *attributes* and their mixes from `termcolor`_ library\n- Easy to combine with other command-line libraries, e.g. `prompt-toolkit`_\n- Flexible API, easy to integrate with existing code\n- User-friendly API for handling POSIX `signals`_\n- Safe **pipes** and **redirects**:\n\n.. code-block:: bash\n\n    $ python script_that_uses_yaspin.py > script.log\n    $ python script_that_uses_yaspin.py | grep ERROR\n\n\nInstallation\n------------\n\nFrom `PyPI`_ using ``pip`` package manager:\n\n.. code-block:: bash\n\n    pip install --upgrade yaspin\n\n\nOr install the latest sources from GitHub:\n\n.. code-block:: bash\n\n    pip install https://github.com/pavdmyt/yaspin/archive/master.zip\n\n\nUsage\n-----\n\nBasic Example\n/////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/basic_example.gif\n\n.. code:: python\n\n    import time\n    from random import randint\n    from yaspin import yaspin\n\n    with yaspin(text=\"Loading\", color=\"yellow\") as spinner:\n        time.sleep(2)  # time consuming code\n\n        success = randint(0, 1)\n        if success:\n            spinner.ok(\"\u2705 \")\n        else:\n            spinner.fail(\"\ud83d\udca5 \")\n\n\nIt is also possible to control spinner manually:\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    spinner = yaspin()\n    spinner.start()\n\n    time.sleep(3)  # time consuming tasks\n\n    spinner.stop()\n\n\nRun any spinner from `cli-spinners`_\n////////////////////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/cli_spinners.gif\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n    from yaspin.spinners import Spinners\n\n    with yaspin(Spinners.earth, text=\"Earth\") as sp:\n        time.sleep(2)                # time consuming code\n\n        # change spinner\n        sp.spinner = Spinners.moon\n        sp.text = \"Moon\"\n\n        time.sleep(2)                # time consuming code\n\n\nAny Colour You Like `\ud83c\udf08`_\n/////////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/basic_colors.gif\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    with yaspin(text=\"Colors!\") as sp:\n        # Support all basic termcolor text colors\n        colors = (\"red\", \"green\", \"yellow\", \"blue\", \"magenta\", \"cyan\", \"white\")\n\n        for color in colors:\n            sp.color, sp.text = color, color\n            time.sleep(1)\n\n\nAdvanced colors usage\n/////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/advanced_colors.gif\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n    from yaspin.spinners import Spinners\n\n    text = \"Bold blink magenta spinner on cyan color\"\n    with yaspin().bold.blink.magenta.bouncingBall.on_cyan as sp:\n        sp.text = text\n        time.sleep(3)\n\n    # The same result can be achieved by passing arguments directly\n    with yaspin(\n        Spinners.bouncingBall,\n        color=\"magenta\",\n        on_color=\"on_cyan\",\n        attrs=[\"bold\", \"blink\"],\n    ) as sp:\n        sp.text = text\n        time.sleep(3)\n\n\nRun any spinner you want\n////////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/custom_spinners.gif\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin, Spinner\n\n    # Compose new spinners with custom frame sequence and interval value\n    sp = Spinner([\"\ud83d\ude38\", \"\ud83d\ude39\", \"\ud83d\ude3a\", \"\ud83d\ude3b\", \"\ud83d\ude3c\", \"\ud83d\ude3d\", \"\ud83d\ude3e\", \"\ud83d\ude3f\", \"\ud83d\ude40\"], 200)\n\n    with yaspin(sp, text=\"Cat!\"):\n        time.sleep(3)  # cat consuming code :)\n\n\nChange spinner properties on the fly\n////////////////////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/sp_properties.gif\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n    from yaspin.spinners import Spinners\n\n    with yaspin(Spinners.noise, text=\"Noise spinner\") as sp:\n        time.sleep(2)\n\n        sp.spinner = Spinners.arc  # spinner type\n        sp.text = \"Arc spinner\"    # text along with spinner\n        sp.color = \"green\"         # spinner color\n        sp.side = \"right\"          # put spinner to the right\n        sp.reversal = True         # reverse spin direction\n\n        time.sleep(2)\n\n\nSpinner with timer\n//////////////////\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    with yaspin(text=\"elapsed time\", timer=True) as sp:\n        time.sleep(3.1415)\n        sp.ok()\n\nCustom Ellipsis\n///////////////\n\nIf the text does not fit in the terminal it gets truncated, you can set a custom ellipsis to signal truncation.\n\n.. code:: python\n\n   import time\n   from yaspin import yaspin\n\n   with yaspin(text=\"some long text\", ellipsis=\"...\") as sp:\n        time.sleep(2)\n\nDynamic text\n////////////\n\n.. code:: python\n\n    import time\n    from datetime import datetime\n    from yaspin import yaspin\n\n    class TimedText:\n        def __init__(self, text):\n            self.text = text\n            self._start = datetime.now()\n\n        def __str__(self):\n            now = datetime.now()\n            delta = now - self._start\n            return f\"{self.text} ({round(delta.total_seconds(), 1)}s)\"\n\n    with yaspin(text=TimedText(\"time passed:\")):\n        time.sleep(3)\n\n\nWriting messages\n////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/write_text.gif\n\nYou should not write any message in the terminal using ``print`` while spinner is open.\nTo write messages in the terminal without any collision with ``yaspin`` spinner, a ``.write()`` method is provided:\n\n.. code:: python\n\n    import time\n    from yaspin import yaspin\n\n    with yaspin(text=\"Downloading images\", color=\"cyan\") as sp:\n        # task 1\n        time.sleep(1)\n        sp.write(\"> image 1 download complete\")\n\n        # task 2\n        time.sleep(2)\n        sp.write(\"> image 2 download complete\")\n\n        # finalize\n        sp.ok(\"\u2714\")\n\n\nIntegration with other libraries\n////////////////////////////////\n\n.. image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/gifs/hide_show.gif\n\nUtilizing ``hidden`` context manager it is possible to toggle the display of\nthe spinner in order to call custom methods that write to the terminal. This is\nhelpful for allowing easy usage in other frameworks like `prompt-toolkit`_.\nUsing the powerful ``print_formatted_text`` function allows you even to apply\nHTML formats and CSS styles to the output:\n\n.. code:: python\n\n    import sys\n    import time\n\n    from yaspin import yaspin\n    from prompt_toolkit import HTML, print_formatted_text\n    from prompt_toolkit.styles import Style\n\n    # override print with feature-rich ``print_formatted_text`` from prompt_toolkit\n    print = print_formatted_text\n\n    # build a basic prompt_toolkit style for styling the HTML wrapped text\n    style = Style.from_dict({\n        'msg': '#4caf50 bold',\n        'sub-msg': '#616161 italic'\n    })\n\n\n    with yaspin(text='Downloading images') as sp:\n        # task 1\n        time.sleep(1)\n        with sp.hidden():\n            print(HTML(\n                u'<b>></b> <msg>image 1</msg> <sub-msg>download complete</sub-msg>'\n            ), style=style)\n\n        # task 2\n        time.sleep(2)\n        with sp.hidden():\n            print(HTML(\n                u'<b>></b> <msg>image 2</msg> <sub-msg>download complete</sub-msg>'\n            ), style=style)\n\n        # finalize\n        sp.ok()\n\n\nHandling POSIX `signals`_\n/////////////////////////\n\nHandling keyboard interrupts (pressing Control-C):\n\n.. code:: python\n\n    import time\n\n    from yaspin import kbi_safe_yaspin\n\n\n    with kbi_safe_yaspin(text=\"Press Control+C to send SIGINT (Keyboard Interrupt) signal\"):\n        time.sleep(5)  # time consuming code\n\n\nHandling other types of signals:\n\n.. code:: python\n\n    import os\n    import time\n    from signal import SIGTERM, SIGUSR1\n\n    from yaspin import yaspin\n    from yaspin.signal_handlers import default_handler, fancy_handler\n\n\n    sigmap = {SIGUSR1: default_handler, SIGTERM: fancy_handler}\n    with yaspin(sigmap=sigmap, text=\"Handling SIGUSR1 and SIGTERM signals\") as sp:\n        sp.write(\"Send signals using `kill` command\")\n        sp.write(\"E.g. $ kill -USR1 {0}\".format(os.getpid()))\n        time.sleep(20)  # time consuming code\n\n\nMore `examples`_.\n\n\nDevelopment\n-----------\n\nClone the repository:\n\n.. code-block:: bash\n\n    git clone https://github.com/pavdmyt/yaspin.git\n\n\nInstall dev dependencies:\n\n.. code-block:: bash\n\n    poetry install\n\n    # if you don't have poetry installed:\n    pip install -r requirements.txt\n\n\nLint code:\n\n.. code-block:: bash\n\n    make lint\n\n\nFormat code:\n\n.. code-block:: bash\n\n    make black-fmt\n\n\nRun tests:\n\n.. code-block:: bash\n\n    make test\n\n\nContributing\n------------\n\n1. Fork it!\n2. Create your feature branch: ``git checkout -b my-new-feature``\n3. Commit your changes: ``git commit -m 'Add some feature'``\n4. Push to the branch: ``git push origin my-new-feature``\n5. Submit a pull request\n6. Make sure tests are passing\n\n\nLicense\n-------\n\n* MIT - Pavlo Dmytrenko; https://twitter.com/pavdmyt\n* Contains data from `cli-spinners`_: MIT License, Copyright (c) Sindre Sorhus sindresorhus@gmail.com (sindresorhus.com)\n\n\n.. |Logo| image:: https://raw.githubusercontent.com/pavdmyt/yaspin/master/static/logo_80.png\n   :alt: yaspin Logo\n.. |Coverage| image:: https://codecov.io/gh/pavdmyt/yaspin/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/pavdmyt/yaspin\n.. |pypi| image:: https://img.shields.io/pypi/v/yaspin.svg\n   :target: https://pypi.org/project/yaspin/\n.. |Versions| image:: https://img.shields.io/pypi/pyversions/yaspin.svg\n   :target: https://pypi.org/project/yaspin/\n.. |Wheel| image:: https://img.shields.io/pypi/wheel/yaspin.svg\n   :target: https://pypi.org/project/yaspin/\n.. |Examples| image:: https://img.shields.io/badge/learn%20by-examples-0077b3.svg\n   :target: https://github.com/pavdmyt/yaspin/tree/master/examples\n.. |black-fmt| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n   :target: https://github.com/ambv/black\n.. |DownloadsTot| image:: https://static.pepy.tech/badge/yaspin\n   :target: https://pepy.tech/project/yaspin\n.. |DownloadsW| image:: https://static.pepy.tech/badge/yaspin/week\n   :target: https://pepy.tech/project/yaspin\n\n\n.. _context manager: https://docs.python.org/3/reference/datamodel.html#context-managers\n.. _decorator: https://www.thecodeship.com/patterns/guide-to-python-function-decorators/\n.. _cli-spinners: https://github.com/sindresorhus/cli-spinners\n.. _termcolor: https://pypi.org/project/termcolor/\n.. _PyPI: https://pypi.org/\n.. _\ud83c\udf08: https://en.wikipedia.org/wiki/Any_Colour_You_Like\n.. _examples: https://github.com/pavdmyt/yaspin/tree/master/examples\n.. _prompt-toolkit: https://github.com/jonathanslenders/python-prompt-toolkit/\n.. _signals: https://www.computerhope.com/unix/signals.htm\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Yet Another Terminal Spinner",
    "version": "3.1.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/pavdmyt/yaspin/issues",
        "Changelog": "https://github.com/pavdmyt/yaspin/releases",
        "Documentation": "https://github.com/pavdmyt/yaspin/blob/master/README.rst",
        "Homepage": "https://github.com/pavdmyt/yaspin",
        "Repository": "https://github.com/pavdmyt/yaspin"
    },
    "split_keywords": [
        "spinner",
        " console",
        " terminal",
        " loader",
        " indicator"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8978fa25b385d9f2c406719b5cf574a0980f5ccc6ea1f8411d56249f44acd3c2",
                "md5": "4724c936f6d90dc08ee9f5dafbbc7855",
                "sha256": "5e3d4dfb547d942cae6565718123f1ecfa93e745b7e51871ad2bbae839e71b73"
            },
            "downloads": -1,
            "filename": "yaspin-3.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4724c936f6d90dc08ee9f5dafbbc7855",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.9",
            "size": 18629,
            "upload_time": "2024-09-22T17:07:06",
            "upload_time_iso_8601": "2024-09-22T17:07:06.923582Z",
            "url": "https://files.pythonhosted.org/packages/89/78/fa25b385d9f2c406719b5cf574a0980f5ccc6ea1f8411d56249f44acd3c2/yaspin-3.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "073c70df5034e6712fcc238b76f6afd1871de143a2a124d80ae2c377cde180f3",
                "md5": "d19c11518098802a4942799bdb86a691",
                "sha256": "7b97c7e257ec598f98cef9878e038bfa619ceb54ac31d61d8ead2b3128f8d7c7"
            },
            "downloads": -1,
            "filename": "yaspin-3.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "d19c11518098802a4942799bdb86a691",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.9",
            "size": 36791,
            "upload_time": "2024-09-22T17:07:09",
            "upload_time_iso_8601": "2024-09-22T17:07:09.376225Z",
            "url": "https://files.pythonhosted.org/packages/07/3c/70df5034e6712fcc238b76f6afd1871de143a2a124d80ae2c377cde180f3/yaspin-3.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-22 17:07:09",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "pavdmyt",
    "github_project": "yaspin",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "requirements": [],
    "lcname": "yaspin"
}
        
Elapsed time: 0.34630s