{ "info": { "author": "Tai Sakuma", "author_email": "tai.sakuma@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "[![PyPI version](https://badge.fury.io/py/atpbar.svg)](https://badge.fury.io/py/atpbar) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/atpbar/badges/version.svg)](https://anaconda.org/conda-forge/atpbar) [![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.2567283.svg)](https://doi.org/10.5281/zenodo.2567283) [![Build Status](https://travis-ci.org/alphatwirl/atpbar.svg?branch=master)](https://travis-ci.org/alphatwirl/atpbar) [![codecov](https://codecov.io/gh/alphatwirl/atpbar/branch/master/graph/badge.svg)](https://codecov.io/gh/alphatwirl/atpbar)\n\n# atpbar\n\n_Progress bars_ for threading and multiprocessing tasks on terminal\nand Jupyter Notebook.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 7811 / 7811 |: task 1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 23258 / 23258 |: task 0\n 65.62% :::::::::::::::::::::::::: | 8018 / 12219 |: task 4\n 60.89% :::::::::::::::::::::::: | 31083 / 51048 |: task 2\n 25.03% :::::::::: | 23884 / 95421 |: task 3\n```\n\n_atpbar_ can display multiple progress bars simultaneously growing to\nshow the progresses of iterations of loops in\n[threading](https://docs.python.org/3/library/threading.html) or\n[multiprocessing](https://docs.python.org/3/library/multiprocessing.html)\ntasks. _atpbar_ can display progress bars on terminal and [Jupyter\nNotebook](https://jupyter.org/). _atpbar_ can be used with\n[_Mantichora_](https://github.com/alphatwirl/mantichora).\n\n_atpbar_ started its development in 2015 as part of\n[_alphatwirl_](https://github.com/alphatwirl/alphatwirl). _atpbar_\nprevented physicists from terminating their running analysis codes,\nwhich would take many hours to complete, by showing progress bars\nindicating their codes were actually running. The progress bars have\nsaved the physicists countless hours total. _atpbar_ had been the\nsub-package\n[_progressbar_](https://github.com/alphatwirl/alphatwirl/tree/v0.22.0/alphatwirl/progressbar)\nof alphatwirl until it became an independent package, with the name\n_atpbar_, in February 2019.\n\n\nYou can try it on Jupyter Notebook online: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/alphatwirl/notebook-atpbar-001/master?filepath=atpbar.ipynb)\n\n*****\n\n- [**Requirement**](#requirement)\n- [**Install**](#install)\n- [**User guide**](#user-guide)\n - [**Quick start**](#quick-start)\n - [Import libraries](#import-libraries)\n - [One loop](#one-loop)\n - [Nested loops](#nested-loops)\n - [Threading](#threading)\n - [Multiprocessing](#multiprocessing)\n - [With Mantichora](#with-mantichora)\n - [**Features**](#features)\n - [A `break` and an exception](#a-break-and-an-exception)\n - [Progress of starting threads and processes with progress bars](#progress-of-starting-threads-and-processes-with-progress-bars)\n - [On Jupyter Notebook](#on-jupyter-notebook)\n - [Non TTY device](#non-tty-device)\n - [How to disable progress bars](#how-to-disable-progress-bars)\n- [**License**](#license)\n- [**Contact**](#contact)\n\n*****\n\n## Requirement\n\n- Python 2.7, 3.6, or 3.7\n\n*****\n\n## Install\n\nYou can install with `conda` from conda-forge:\n\n```bash\nconda install -c conda-forge atpbar\n```\n\nor with `pip`:\n\n```bash\npip install -U atpbar\n```\n\n*****\n\n## User guide\n\n### Quick start\n\nI will show here how to use atpbar by simple examples.\n\n#### Import libraries\n\nTo create simple loops in the examples, we use two python standard\nlibraries, [time](https://docs.python.org/3/library/time.html) and\n[random](https://docs.python.org/3/library/random.html). Import the\ntwo packages as well as `atpbar`.\n\n```python\nimport time, random\nfrom atpbar import atpbar\n```\n\n**Note**: import the object `atpbar` from the package `atpbar` rather\nthan importing the package `atpbar` itself.\n\n#### One loop\n\nThe object `atpbar` is an iterable that can wrap another iterable and\nshows the progress bars for the iterations. (The idea of making the\ninterface iterable was inspired by\n[tqdm](https://github.com/tqdm/tqdm).)\n\n\n```python\nn = random.randint(1000, 10000)\nfor i in atpbar(range(n)):\n time.sleep(0.0001)\n```\n\nThe task in the above code is to sleep for `0.0001` seconds in each\niteration of the loop. The number of the iterations of the loop is\nrandomly selected from between `1000` and `10000`.\n\nA progress bar will be shown by `atpbar`.\n\n```\n 51.25% :::::::::::::::::::: | 4132 / 8062 |: range(0, 8062) \n```\n\nIn order for `atpbar` to show a progress bar, the wrapped iterable\nneeds to have a length. If the length cannot be obtained by `len()`,\n`atpbar` won't show a progress bar.\n\n#### Nested loops\n\n`atpbar` can show progress bars for nested loops as in the following\nexample.\n\n```python\nfor i in atpbar(range(4), name='outer'):\n n = random.randint(1000, 10000)\n for j in atpbar(range(n), name='inner {}'.format(i)):\n time.sleep(0.0001)\n```\n\nThe outer loop iterates 4 times. The inner loop is similar to the loop\nin the previous example---sleeps for `0.0001` seconds. You can\noptionally give the keyword argument `name` to specify the label on\nthe progress bar.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 3287 / 3287 |: inner 0\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 5850 / 5850 |: inner 1\n 50.00% :::::::::::::::::::: | 2 / 4 |: outer \n 34.42% ::::::::::::: | 1559 / 4529 |: inner 2\n```\n\nIn the snapshot of the progress bars above, the outer loop is in its\n3rd iteration. The inner loop has completed twice and is running the\nthird. The progress bars for the completed tasks move up. The progress\nbars for the active tasks are growing at the bottom.\n\n#### Threading\n\n`atpbar` can show multiple progress bars for loops concurrently\niterating in different threads.\n\nThe function `run_with_threading()` in the following code shows an\nexample.\n\n```python\nfrom atpbar import flush\nimport threading\n\ndef run_with_threading():\n nthreads = 5\n def task(n, name):\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n threads = [ ]\n for i in range(nthreads):\n name = 'thread {}'.format(i)\n n = random.randint(5, 100000)\n t = threading.Thread(target=task, args=(n, name))\n t.start()\n threads.append(t)\n for t in threads:\n t.join()\n flush()\n\nrun_with_threading()\n```\n\nThe task to sleep for `0.0001` seconds is defined as the function\n`task`. The `task` is concurrently run 5 times with `threading`.\n`atpbar` can be used in any threads. Five progress bars growing\nsimultaneously will be shown. The function `flush()` returns when the\nprogress bars have finished updating.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8042 / 8042 |: thread 3 \n 33.30% ::::::::::::: | 31967 / 95983 |: thread 0 \n 77.41% :::::::::::::::::::::::::::::: | 32057 / 41411 |: thread 1 \n 45.78% :::::::::::::::::: | 31816 / 69499 |: thread 2 \n 39.93% ::::::::::::::: | 32373 / 81077 |: thread 4 \n```\n\nAs a task completes, the progress bar for the task moves up. The\nprogress bars for active tasks are at the bottom.\n\n#### Multiprocessing\n\n`atpbar` can be used with `multiprocessing`.\n\nThe function `run_with_multiprocessing()` in the following code shows\nan example.\n\n```python\nimport multiprocessing\nfrom atpbar import register_reporter, find_reporter, flush\n\ndef run_with_multiprocessing():\n def task(n, name):\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n def worker(reporter, task, queue):\n register_reporter(reporter)\n while True:\n args = queue.get()\n if args is None:\n queue.task_done()\n break\n task(*args)\n queue.task_done()\n nprocesses = 4\n ntasks = 10\n reporter = find_reporter()\n queue = multiprocessing.JoinableQueue()\n for i in range(nprocesses):\n p = multiprocessing.Process(target=worker, args=(reporter, task, queue))\n p.start()\n for i in range(ntasks):\n name = 'task {}'.format(i)\n n = random.randint(5, 100000)\n queue.put((n, name))\n for i in range(nprocesses):\n queue.put(None)\n queue.join()\n flush()\n\nrun_with_multiprocessing()\n```\n\nIt starts four workers in subprocesses with `multiprocessing` and have\nthem run ten tasks.\n\nIn order to use `atpbar` in a subprocess, the `reporter`, which can be\nfound in the main process by the function `find_reporter()`, needs to\nbe brought to the subprocess and registered there by the function\n`register_reporter()`.\n\nSimultaneously growing progress bars will be shown.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 44714 / 44714 |: task 3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 47951 / 47951 |: task 2\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 21461 / 21461 |: task 5\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 73721 / 73721 |: task 1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 31976 / 31976 |: task 4\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 80765 / 80765 |: task 0\n 58.12% ::::::::::::::::::::::: | 20133 / 34641 |: task 6\n 20.47% :::::::: | 16194 / 79126 |: task 7\n 47.71% ::::::::::::::::::: | 13072 / 27397 |: task 8\n 76.09% :::::::::::::::::::::::::::::: | 9266 / 12177 |: task 9\n```\n\n#### With Mantichora\n\n[_Mantichora_](https://github.com/alphatwirl/mantichora) provides a\nsimple interface to _multiprocessing_.\n\nWith Mantichora, `task()` can be concurrently run with multiprocessing\nwith as simple code as the following example:\n\n```python\nfrom mantichora import mantichora\n\ndef task(name):\n n = random.randint(1000, 10000)\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n\nwith mantichora() as mcore:\n mcore.run(task, 'task 1')\n mcore.run(task, 'task 2')\n mcore.run(task, 'task 3')\n mcore.run(task, 'task 4')\n mcore.run(task, 'task 5')\n returns = mcore.returns()\n```\n\n`atpbar` can be used in the task function.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 2288 / 2288 |: task 3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 3964 / 3964 |: task 4\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 4207 / 4207 |: task 2\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8519 / 8519 |: task 1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 6595 / 6595 |: task 5\n```\n\n*****\n\n### Features\n\n#### A `break` and an exception\n\nWhen the loop ends with a `break` or an exception, the progress bar stops with\nthe last complete iteration.\n\nFor example, the loop in the following code breaks during the 1235th iteration.\n```python\nfor i in atpbar(range(2000)):\n if i == 1234:\n break\n time.sleep(0.0001)\n```\n\nSince `i` starts with `0`, when `i` is `1234`, the loop is in its 1235th\niteration. The last complete iteration is 1234. The progress bar stops at 1234.\n\n```\n 61.70% :::::::::::::::::::::::: | 1234 / 2000 |: range(0, 2000)\n```\n\nAs an example of an exception, in the following code, an exception is\nthrown during the 1235th iteration.\n```python\nfor i in atpbar(range(2000)):\n if i == 1234:\n raise Exception\n time.sleep(0.0001)\n```\nThe progress bar stops at the last complete iteration, 1234.\n\n```\n 61.70% :::::::::::::::::::::::: | 1234 / 2000 |: range(0, 2000)\nTraceback (most recent call last):\n File \"\", line 3, in \nException\n```\n\nThis feature works as well with nested loops, threading, and\nmultiprocessing. For example, in the following code, the loops in five\nthreads break at 1235th iteration.\n\n```python\nfrom atpbar import flush\nimport threading\n\ndef run_with_threading():\n def task(n, name):\n for i in atpbar(range(n), name=name):\n if i == 1234:\n break\n time.sleep(0.0001)\n nthreads = 5\n threads = [ ]\n for i in range(nthreads):\n name = 'thread {}'.format(i)\n n = random.randint(3000, 10000)\n t = threading.Thread(target=task, args=(n, name))\n t.start()\n threads.append(t)\n for t in threads:\n t.join()\n flush()\n\nrun_with_threading()\n```\n\nAll progress bars stop at 1234.\n\n```\n 18.21% ::::::: | 1234 / 6777 |: thread 0\n 15.08% :::::: | 1234 / 8183 |: thread 2\n 15.25% :::::: | 1234 / 8092 |: thread 1\n 39.90% ::::::::::::::: | 1234 / 3093 |: thread 4\n 19.67% ::::::: | 1234 / 6274 |: thread 3\n```\n\n#### Progress of starting threads and processes with progress bars\n\n`atpbar` can be used for a loop that starts sub-threads or\nsub-processes in which `atpbar` is also used.\n\n```python\nfrom atpbar import flush\nimport threading\n\ndef run_with_threading():\n def task(n, name):\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n nthreads = 5\n threads = [ ]\n for i in atpbar(range(nthreads)):\n name = 'thread {}'.format(i)\n n = random.randint(200, 1000)\n t = threading.Thread(target=task, args=(n, name))\n t.start()\n threads.append(t)\n time.sleep(0.1)\n for t in threads:\n t.join()\n flush()\n\nrun_with_threading()\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 209 / 209 |: thread 1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 699 / 699 |: thread 0\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 775 / 775 |: thread 2\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 495 / 495 |: thread 3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 5 / 5 |: range(0, 5)\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 647 / 647 |: thread 4 \n```\n\nThe `atpbar` sensibly works regardless of the order in which multiple\ninstances of `atpbar` in multiple threads and multiple processes start\nand end. The progress bars in the example above indicates that the\nloops in four threads have already ended before the loop in the main\nthreads ended; the loop in the last thread ended afterwards.\n\n*****\n\n#### On Jupyter Notebook\n\nOn Jupyter Notebook, `atpbar` shows progress bars based on\n[widgets](https://ipywidgets.readthedocs.io).\n\n\n\nYou can try interactively online:\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/alphatwirl/notebook-atpbar-001/master?filepath=atpbar.ipynb)\n\n*****\n\n#### Non TTY device\n\nIf neither on Jupyter Notebook or on a TTY device, `atpbar` is not\nable to show progress bars. `atpbar` occasionally prints the status.\n\n```\n03/04 09:17 : 1173 / 7685 ( 15.26%): thread 0 \n03/04 09:17 : 1173 / 6470 ( 18.13%): thread 3 \n03/04 09:17 : 1199 / 1199 (100.00%): thread 4 \n03/04 09:18 : 1756 / 2629 ( 66.79%): thread 2 \n03/04 09:18 : 1757 / 7685 ( 22.86%): thread 0 \n03/04 09:18 : 1757 / 6470 ( 27.16%): thread 3 \n03/04 09:19 : 2342 / 2629 ( 89.08%): thread 2 \n```\n\n*****\n\n#### How to disable progress bars\n\nThe function `disable()` disables `atpbar`; progress bars will not be shown.\n\n```python\nfrom atpbar import disable\n\ndisable()\n```\n\nThis function needs to be called before `atpbar` or `find_reporter()` is used,\ntypically at the beginning of the program.\n\n*****\n\n## License\n\n- atpbar is licensed under the BSD license.\n\n*****\n\n## Contact\n\n- Tai Sakuma - tai.sakuma@gmail.com\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/alphatwirl/atpbar", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "atpbar", "package_url": "https://pypi.org/project/atpbar/", "platform": "", "project_url": "https://pypi.org/project/atpbar/", "project_urls": { "Homepage": "https://github.com/alphatwirl/atpbar" }, "release_url": "https://pypi.org/project/atpbar/1.0.4/", "requires_dist": null, "requires_python": "", "summary": "Progress bars for threading and multiprocessing tasks", "version": "1.0.4" }, "last_serial": 5177390, "releases": { "0.9.0": [ { "comment_text": "", "digests": { "md5": "82629d776636b67a5c448b99017a9cc0", "sha256": "295f978b23225f80474c94c5fe43d50f082aa61a326963cf64e0380dc2dc6586" }, "downloads": -1, "filename": "atpbar-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "82629d776636b67a5c448b99017a9cc0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11151, "upload_time": "2019-02-17T02:46:17", "url": "https://files.pythonhosted.org/packages/3e/b4/4b1d0f1ce046a2b3f3bbbc0047f9ef6d85da137ee2555ae0b3d9eddf5a96/atpbar-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0adf2c9441dac4c1acd765e24d636a33", "sha256": "d3cf45fbe775a391c15833b5e1f4a7c189acfc48f0b7d7e3ffdefc01aefe4391" }, "downloads": -1, "filename": "atpbar-0.9.0.tar.gz", "has_sig": false, "md5_digest": "0adf2c9441dac4c1acd765e24d636a33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22323, "upload_time": "2019-02-17T02:46:19", "url": "https://files.pythonhosted.org/packages/3d/88/9bee5231679129306ee2821e40fddb0897a42c60f998da01ba52653bf1f0/atpbar-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "9495720f7b03e32b59f239938e0342dd", "sha256": "a93ebf65779b31ed8f9da964dbdb8c3788b2dd24864039b5994362506464de43" }, "downloads": -1, "filename": "atpbar-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9495720f7b03e32b59f239938e0342dd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11183, "upload_time": "2019-02-17T13:49:28", "url": "https://files.pythonhosted.org/packages/68/db/3393fec7637b7c67a2aed7cf18a453d6c1cd1a9b7a9c99c4ada533ff8b02/atpbar-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5678f9f510ee5f7069f1e2910c5183cf", "sha256": "6c696960dd642c73962c3a1e57aafb298874390d4e40dcdf424a607801c97006" }, "downloads": -1, "filename": "atpbar-0.9.1.tar.gz", "has_sig": false, "md5_digest": "5678f9f510ee5f7069f1e2910c5183cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24261, "upload_time": "2019-02-17T13:49:29", "url": "https://files.pythonhosted.org/packages/38/db/73570802a8f0bf2b61abaa78385d44ba397833f53806effc268dae7b557a/atpbar-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "89c5bb306aceb767e895bc5d3e520026", "sha256": "5ffae07754f2b47372e6b30466c86b13d44e63c72863dd8a28c02a1da05dd0a9" }, "downloads": -1, "filename": "atpbar-0.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89c5bb306aceb767e895bc5d3e520026", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11474, "upload_time": "2019-02-17T16:57:09", "url": "https://files.pythonhosted.org/packages/f0/c2/2ba25f0cf3c782d7f2d9cedd5fe9a39d357ac0aad713ee30352ce8e161ae/atpbar-0.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5690b8a7714122c6e8da7f5fa46318af", "sha256": "4e0b852d391c54e9d4fdb00d8f50d1dfba9061c233536eedfa3c1a5a0b6b208d" }, "downloads": -1, "filename": "atpbar-0.9.2.tar.gz", "has_sig": false, "md5_digest": "5690b8a7714122c6e8da7f5fa46318af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24914, "upload_time": "2019-02-17T16:57:10", "url": "https://files.pythonhosted.org/packages/78/a8/4f5807f739df79739093df07748a648a1efba7dc4e477fda05fc10cd3daf/atpbar-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "73f75ed10945ba6bfaf1b4b9225c80af", "sha256": "182332727a912fef5a583a58e59b8df2f2eee6572dfae53a6d419b58fce148e1" }, "downloads": -1, "filename": "atpbar-0.9.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "73f75ed10945ba6bfaf1b4b9225c80af", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15589, "upload_time": "2019-02-18T12:34:21", "url": "https://files.pythonhosted.org/packages/ab/9e/9727e9ecc8c025b83420881e34bcf22c55c5dffe6ad5fb5b390f5fe3bec3/atpbar-0.9.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e5ec9a34fc7556dd89bfe89194b827be", "sha256": "507398ce12714b15ff601b9dedad071955803fbbbd58f621c877b23103d2505d" }, "downloads": -1, "filename": "atpbar-0.9.3.tar.gz", "has_sig": false, "md5_digest": "e5ec9a34fc7556dd89bfe89194b827be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27374, "upload_time": "2019-02-18T12:34:22", "url": "https://files.pythonhosted.org/packages/67/8c/8cb51533054128c4e2b12e22229a19dc5fccb640b4f6d2516212a06650f3/atpbar-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "376b1ac97229eda00d63feb7c47efe15", "sha256": "7eb11f22d029127028e51a7e6d01005403a5f30be2ea9ef9d577028f34c102ad" }, "downloads": -1, "filename": "atpbar-0.9.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "376b1ac97229eda00d63feb7c47efe15", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15610, "upload_time": "2019-02-18T22:10:09", "url": "https://files.pythonhosted.org/packages/95/ef/8c4415bf2d0770484333d3312cf8e9a9765de86d89f24d2caefea13731ac/atpbar-0.9.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c37a07d9146939e0971f4ba887db3e44", "sha256": "a788fd8578cd5a35dd9407108b1fbe66228c01946ac88ea4f093bef1d12288c5" }, "downloads": -1, "filename": "atpbar-0.9.4.tar.gz", "has_sig": false, "md5_digest": "c37a07d9146939e0971f4ba887db3e44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27547, "upload_time": "2019-02-18T22:10:10", "url": "https://files.pythonhosted.org/packages/ad/0b/6afcdf422e779b82dfecd20012a64f999e0504c4e8a708a828cf80df6294/atpbar-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "f2f40f1bf2298462682643528c1e4507", "sha256": "89fc7d66e5b06d47f117e36ace46ad78b64f080ea5b868b4562be8c952269520" }, "downloads": -1, "filename": "atpbar-0.9.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f2f40f1bf2298462682643528c1e4507", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18074, "upload_time": "2019-02-19T05:24:02", "url": "https://files.pythonhosted.org/packages/d9/ee/b1bbbefe653cce407d730fd55cf64f325b2385ee5af03c8aae17db451f69/atpbar-0.9.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fcdf2934a9ccafe0a19c49a2c46fe664", "sha256": "70e049e235f37d3b7033ecec1041f7f9e5e13c8f19829743a77e356ee555c30e" }, "downloads": -1, "filename": "atpbar-0.9.5.tar.gz", "has_sig": false, "md5_digest": "fcdf2934a9ccafe0a19c49a2c46fe664", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30724, "upload_time": "2019-02-19T05:24:04", "url": "https://files.pythonhosted.org/packages/59/bb/5d7b7b929b7cf9041da91ec01f74ccbbc19fc326a4710a027935a59fb5fb/atpbar-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "8728d987b3a6eb6d9d4230d5da366007", "sha256": "36247eb757a7840c509ca03dad4049b0d1e10f44765a0c21471042d5361f56f9" }, "downloads": -1, "filename": "atpbar-0.9.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8728d987b3a6eb6d9d4230d5da366007", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23933, "upload_time": "2019-02-22T12:01:18", "url": "https://files.pythonhosted.org/packages/95/30/64c31f072e4305977b92285802658b0dfc1d16839130e3bb266d1d7cefda/atpbar-0.9.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f76ba566ab9a46acb86560aa4aae711", "sha256": "bf44b2119f488431f2f35e55d7ac2848cf4618c64ed963500e03df60aa44ccb2" }, "downloads": -1, "filename": "atpbar-0.9.6.tar.gz", "has_sig": false, "md5_digest": "6f76ba566ab9a46acb86560aa4aae711", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37008, "upload_time": "2019-02-22T12:01:20", "url": "https://files.pythonhosted.org/packages/cb/b6/667edf3631b4c361e262600dba4ab1e0af74f9b0235038260319be4e0fb9/atpbar-0.9.6.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "da88f8e5a6ec5c9b53ab09de81c93c6c", "sha256": "5feba408edf7a8cdd96c6dbda5cce6529b95bb1985fb6193e03f2e729dfebcfa" }, "downloads": -1, "filename": "atpbar-0.9.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "da88f8e5a6ec5c9b53ab09de81c93c6c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 25515, "upload_time": "2019-02-24T18:12:11", "url": "https://files.pythonhosted.org/packages/ee/80/5eb84d28dac80d1a8abc638324cb6b590d2b296437a0d9d650582fac0297/atpbar-0.9.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "460b5296b7a2d98110dc1ee85288bfa5", "sha256": "6bbb4b557005217d43c3285ad7826c012a0cc030cf9132648432fbe457df4295" }, "downloads": -1, "filename": "atpbar-0.9.7.tar.gz", "has_sig": false, "md5_digest": "460b5296b7a2d98110dc1ee85288bfa5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38336, "upload_time": "2019-02-24T18:12:12", "url": "https://files.pythonhosted.org/packages/8b/7d/e7001c0e67b84fbd9dbf1fc59738ada7091e2d05990fe152084298a07099/atpbar-0.9.7.tar.gz" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "a3e9344c14982b9fbc9fa7b83be0170f", "sha256": "774d4cfcb780020151df780185154605850268034b5d6adb804419711a1452e3" }, "downloads": -1, "filename": "atpbar-0.9.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a3e9344c14982b9fbc9fa7b83be0170f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27559, "upload_time": "2019-03-03T04:04:02", "url": "https://files.pythonhosted.org/packages/2a/53/15051b5b36aaa2b34b74e68d83a80a852c34468736e7fccc898f0ff6c037/atpbar-0.9.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ec6111c2b83c62bde8f20cfb4a933e8", "sha256": "652d9e33318b21be35fd05dba51d06680df1db791e7d52034eb5d15929216c4f" }, "downloads": -1, "filename": "atpbar-0.9.8.tar.gz", "has_sig": false, "md5_digest": "3ec6111c2b83c62bde8f20cfb4a933e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39276, "upload_time": "2019-03-03T04:04:04", "url": "https://files.pythonhosted.org/packages/65/80/47c3fa9db0c378919eda410e066fa11da176f8f621745d3b06731bc857e2/atpbar-0.9.8.tar.gz" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "c0c0802d3a1f16296bdfc9b87783595c", "sha256": "72f3fafd72a05d1cf2be7e8d631a8b2a595e9242c45bf30ffa5c63e2119bc5d0" }, "downloads": -1, "filename": "atpbar-0.9.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c0c0802d3a1f16296bdfc9b87783595c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27672, "upload_time": "2019-03-03T11:35:51", "url": "https://files.pythonhosted.org/packages/26/45/ac0c6f5f5b765767cda9ba8173705ace87a5f9454c94fd51a29834426f0b/atpbar-0.9.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddcd13276adb13675d008a07a7ed7e62", "sha256": "573a7dbd4c801c8d0ecfe52ead330849ffa66438ecf4fd4880427071d4345d8d" }, "downloads": -1, "filename": "atpbar-0.9.9.tar.gz", "has_sig": false, "md5_digest": "ddcd13276adb13675d008a07a7ed7e62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39715, "upload_time": "2019-03-03T11:35:52", "url": "https://files.pythonhosted.org/packages/e5/3d/3008b062dad9ef9fba8f2cb3db4f94c730bae84b5ff0f82a6a7ae4551758/atpbar-0.9.9.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "25ba3704ac84147214e7f285ed570ee6", "sha256": "19688367901f54d022966a3bf1792b260de2423803af60e59cf2df10f5dfce33" }, "downloads": -1, "filename": "atpbar-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "25ba3704ac84147214e7f285ed570ee6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27678, "upload_time": "2019-03-03T12:22:27", "url": "https://files.pythonhosted.org/packages/5f/c1/18dde1bbc8a24025620674d863aa0111793d416ef7020654c0278669cc91/atpbar-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ace6f7606d71997fefe121082a052e5a", "sha256": "d6fc797cddb96088d001cc4660450b083587a1a1f6eb99f9f02923d2d0987da3" }, "downloads": -1, "filename": "atpbar-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ace6f7606d71997fefe121082a052e5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39736, "upload_time": "2019-03-03T12:22:29", "url": "https://files.pythonhosted.org/packages/28/c9/d518cf8018fe721853ddd47c708a7fd97ec1898de6f676702510318ae3a9/atpbar-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "5ed71e1ab7799e9d7e7deb3740330e1b", "sha256": "1d48f1634ef12b5c7ad14c4c596ec7b6374547a25035da753b86c107cc50718d" }, "downloads": -1, "filename": "atpbar-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5ed71e1ab7799e9d7e7deb3740330e1b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27677, "upload_time": "2019-03-03T13:47:14", "url": "https://files.pythonhosted.org/packages/9f/71/840b8cb1a8ed0f8629d092779eb4e1b1ce6d710a423c133cc7d1edd19270/atpbar-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f03ded916fed4870a3cb9d896a5e69c0", "sha256": "aadeb599271ae545ef1adc0af2aacc3177d655806a8011f0a986fdb4171e0d49" }, "downloads": -1, "filename": "atpbar-1.0.1.tar.gz", "has_sig": false, "md5_digest": "f03ded916fed4870a3cb9d896a5e69c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39740, "upload_time": "2019-03-03T13:47:15", "url": "https://files.pythonhosted.org/packages/86/70/0b2cc40353765c693e589ab62432e1a0da656171bd5481bd55ca994c7bc4/atpbar-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "622344d6f84cdb92986fdd0581a72142", "sha256": "557ed62b4d923af75d2b1f3d1c239ef19122f0885e0c78c43e54d9fb87ba1d08" }, "downloads": -1, "filename": "atpbar-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "622344d6f84cdb92986fdd0581a72142", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28067, "upload_time": "2019-03-08T08:13:44", "url": "https://files.pythonhosted.org/packages/85/4c/5bad82ad02299116780d99ee2732fc758626922d7fe06e0ffd3fabdb81e7/atpbar-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23c9dcbc413691d9e4c4f3429d5f1043", "sha256": "086f7f474f21db01904c7cf4bf3879e1bd6c1baaeb31a1fb3454d65e57cf4434" }, "downloads": -1, "filename": "atpbar-1.0.2.tar.gz", "has_sig": false, "md5_digest": "23c9dcbc413691d9e4c4f3429d5f1043", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41774, "upload_time": "2019-03-08T08:13:46", "url": "https://files.pythonhosted.org/packages/4f/68/f6f766422c65f007f97231a51fabd6240683dfe111a9e722505c079d610f/atpbar-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "02dd41c198c932d6e9e341f41797debd", "sha256": "edcc27bdbce49a4c8909c8689ae08ade2447e6c310d26f542cd2d3169f1c47ea" }, "downloads": -1, "filename": "atpbar-1.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "02dd41c198c932d6e9e341f41797debd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28154, "upload_time": "2019-03-15T21:32:56", "url": "https://files.pythonhosted.org/packages/61/94/2f8a398f23e2e947949709c829b3ff4b1e679a8cc8ceb8a774c4d0ce382d/atpbar-1.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0aadf6933a3a58449dc1fbd36200573a", "sha256": "d148749476f646021faddf79b50de0e0b1b2258fb9cfe07db551b40006bbaa07" }, "downloads": -1, "filename": "atpbar-1.0.3.tar.gz", "has_sig": false, "md5_digest": "0aadf6933a3a58449dc1fbd36200573a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41807, "upload_time": "2019-03-15T21:32:58", "url": "https://files.pythonhosted.org/packages/76/72/81a186c62726f82aaf338abecee73b27c1777bc464ca4c124c0fd7172b75/atpbar-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "c6c1144baa02e646e8bd40d4bdf16d3e", "sha256": "1de628908978822dcd576eacdc87fd320d8515548e57ecbcd46e9a62c3f5e9d0" }, "downloads": -1, "filename": "atpbar-1.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c6c1144baa02e646e8bd40d4bdf16d3e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29401, "upload_time": "2019-04-23T13:26:42", "url": "https://files.pythonhosted.org/packages/88/d4/1ec8a6ed0bac67f4a201226768b1ae27f4f7f4b7f2f7144b552e52e00e48/atpbar-1.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "552487f11d39455d980f5f3f6c30edbb", "sha256": "ca06ee5425984a8b1405abd93e3b82536e97f373fac771c8247672a36bc18191" }, "downloads": -1, "filename": "atpbar-1.0.4.tar.gz", "has_sig": false, "md5_digest": "552487f11d39455d980f5f3f6c30edbb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42831, "upload_time": "2019-04-23T13:26:43", "url": "https://files.pythonhosted.org/packages/c1/65/72b7c7cc4e329f85c062fc8052bb0dc2c565f8aa819a51818eb4cbe402a0/atpbar-1.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c6c1144baa02e646e8bd40d4bdf16d3e", "sha256": "1de628908978822dcd576eacdc87fd320d8515548e57ecbcd46e9a62c3f5e9d0" }, "downloads": -1, "filename": "atpbar-1.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c6c1144baa02e646e8bd40d4bdf16d3e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29401, "upload_time": "2019-04-23T13:26:42", "url": "https://files.pythonhosted.org/packages/88/d4/1ec8a6ed0bac67f4a201226768b1ae27f4f7f4b7f2f7144b552e52e00e48/atpbar-1.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "552487f11d39455d980f5f3f6c30edbb", "sha256": "ca06ee5425984a8b1405abd93e3b82536e97f373fac771c8247672a36bc18191" }, "downloads": -1, "filename": "atpbar-1.0.4.tar.gz", "has_sig": false, "md5_digest": "552487f11d39455d980f5f3f6c30edbb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42831, "upload_time": "2019-04-23T13:26:43", "url": "https://files.pythonhosted.org/packages/c1/65/72b7c7cc4e329f85c062fc8052bb0dc2c565f8aa819a51818eb4cbe402a0/atpbar-1.0.4.tar.gz" } ] }