{"id":22666516,"url":"https://github.com/alphatwirl/atpbar","last_synced_at":"2026-04-26T23:00:53.405Z","repository":{"id":44950551,"uuid":"171072963","full_name":"alphatwirl/atpbar","owner":"alphatwirl","description":"Progress bars for threading and multiprocessing tasks on terminal and Jupyter Notebook","archived":false,"fork":false,"pushed_at":"2026-04-26T20:31:00.000Z","size":1250,"stargazers_count":98,"open_issues_count":11,"forks_count":9,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-26T20:32:12.763Z","etag":null,"topics":["jupyter-notebook","multiprocessing","progress-bars","terminal-based","threading"],"latest_commit_sha":null,"homepage":"https://alphatwirl.github.io/atpbar/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alphatwirl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-17T02:15:54.000Z","updated_at":"2026-04-26T20:30:53.000Z","dependencies_parsed_at":"2024-05-12T15:50:20.054Z","dependency_job_id":null,"html_url":"https://github.com/alphatwirl/atpbar","commit_stats":{"total_commits":372,"total_committers":4,"mean_commits":93.0,"dds":0.008064516129032251,"last_synced_commit":"b6ca69c65a3573f6f920c0babe50328abe0903eb"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/alphatwirl/atpbar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alphatwirl%2Fatpbar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alphatwirl%2Fatpbar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alphatwirl%2Fatpbar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alphatwirl%2Fatpbar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alphatwirl","download_url":"https://codeload.github.com/alphatwirl/atpbar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alphatwirl%2Fatpbar/sbom","scorecard":{"id":186703,"data":{"date":"2025-08-11","repo":{"name":"github.com/alphatwirl/atpbar","commit":"fe86a49dc01c12a17e3e1dd458458ba7d72a4dff"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/11 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/doc.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/doc.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/doc.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/doc.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/doc.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/doc.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/type-check.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/type-check.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/type-check.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/type-check.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-test.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/unit-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-test.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/unit-test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unit-test.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/alphatwirl/atpbar/unit-test.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/doc.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/type-check.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/type-check.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/type-check.yml:35","Warn: pipCommand not pinned by hash: .github/workflows/unit-test.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/unit-test.yml:41","Warn: pipCommand not pinned by hash: .github/workflows/unit-test.yml:43","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   9 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:12","Warn: topLevel 'contents' permission set to 'write': .github/workflows/doc.yml:7","Warn: no topLevel permission defined: .github/workflows/pypi.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/type-check.yml:1","Warn: no topLevel permission defined: .github/workflows/unit-test.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/pypi.yml:10"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T19:55:36.761Z","repository_id":44950551,"created_at":"2025-08-16T19:55:36.761Z","updated_at":"2025-08-16T19:55:36.761Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32315712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T21:09:39.134Z","status":"ssl_error","status_checked_at":"2026-04-26T21:09:21.240Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jupyter-notebook","multiprocessing","progress-bars","terminal-based","threading"],"created_at":"2024-12-09T14:15:11.135Z","updated_at":"2026-04-26T23:00:53.399Z","avatar_url":"https://github.com/alphatwirl.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![PyPI - Version](https://img.shields.io/pypi/v/atpbar.svg)](https://pypi.org/project/atpbar)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/atpbar.svg)](https://pypi.org/project/atpbar)\n[![Anaconda-Server Badge](https://anaconda.org/conda-forge/atpbar/badges/version.svg)](https://anaconda.org/conda-forge/atpbar)\n[![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.2567283.svg)](https://doi.org/10.5281/zenodo.2567283)\n\n[![Test Status](https://github.com/alphatwirl/atpbar/actions/workflows/unit-test.yml/badge.svg)](https://github.com/alphatwirl/atpbar/actions/workflows/unit-test.yml)\n[![Test Status](https://github.com/alphatwirl/atpbar/actions/workflows/type-check.yml/badge.svg)](https://github.com/alphatwirl/atpbar/actions/workflows/type-check.yml)\n[![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 the terminal and\nJupyter Notebook.\n\n![Demo](demo.svg)\n\n_atpbar_ can display multiple progress bars simultaneously growing to show the\nprogress of each iteration 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 the terminal and [Jupyter\nNotebook](https://jupyter.org/).\n\n## Quick Start\n\nThis short tutorial shows the basic usage of _atpbar_ with simple examples.\n\n### Installation\n\nYou can use `pip` to install `atpbar`:\n\n```bash\npip install atpbar\n```\n\n### How to use\n\n#### Start Python\n\nYou can try the examples in this tutorial in the Python interactive shell.\n\n```bash\n$ python\nPython 3.13.9 (...)\n...\n...\n\u003e\u003e\u003e\n```\n\n#### Import packages\n\nImport `atpbar` and other objects that we will use in the examples.\n\n```python\nfrom random import randint\nfrom time import sleep\nfrom atpbar import atpbar\n```\n\n#### One loop\n\nThe `atpbar` can wrap an iterable to show a progress bar for the iterations.\n\n```python\nn = randint(1000, 10000)  # Random number of iterations\nfor _ in atpbar(range(n)):\n    sleep(0.001)\n```\n\nThis example randomly selects the number of iterations and, in each iteration,\nsleeps for a short time.\n\nThe progress bar will be shown as the loop progresses.\n\n```plaintext\n  51.25% ::::::::::::::::::::                     |     4132 /     8062 |:  range(0, 8062)\n```\n\nNote: `atpbar` won't show a progress bar if the length of the iterable cannot be\nobtained by `len()`.\n\n#### Nested loops\n\nThe `atpbar` can show progress bars for nested loops.\n\n```python\nfor i in atpbar(range(4), name='Outer'):\n    n = randint(1000, 10000)\n    for _ in atpbar(range(n), name=f'Inner {i}'):\n        sleep(0.001)\n```\n\nThis example iterates over an outer loop four times. In each iteration, it\niterates over an inner loop. The progress bars for both the outer and inner\nloops are shown.\n\n```plaintext\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 third\niteration. The inner loop has been completed twice and is running the third.\nThe progress bars for the completed tasks move up. The progress bars for the\nactive tasks are growing at the bottom.\n\n#### Threading\n\nAs the last example, we show how to use `atpbar` with threading. We will use\nthe\n[`ThreadPoolExecutor`](https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor)\nfrom the\n[`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html)\nmodule.\n\nImport `ThreadPoolExecutor` and also `flushing` from `atpbar`.\n\n```python\nfrom concurrent.futures import ThreadPoolExecutor\nfrom atpbar import flushing\n```\n\nDefine a function that will be executed by the threads.\n\n```python\ndef func(n, name):\n    for _ in atpbar(range(n), name=name):\n        sleep(0.001)\n```\n\nWe will submit ten jobs each runs the `func` function to five threads.\n\n```python\nn_workers = 5\nn_jobs = 10\n\nwith flushing(), ThreadPoolExecutor(max_workers=n_workers) as executor:\n    for i in range(n_jobs):\n        n = randint(1000, 10000)\n        executor.submit(func, n, name=f'Job {i}')\n\n```\n\nThe context manager `flushing()` exits after the progress bars have finished\nupdating.\n\nThe progress bars will be simultaneously updated for concurrent jobs.\n\n```plaintext\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     2326 /     2326 |:  Job 0\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     2971 /     2971 |:  Job 1\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     1386 /     1386 |:  Job 6\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     5316 /     5316 |:  Job 3\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     7786 /     7786 |:  Job 4\n 100.00% :::::::::::::::::::::::::::::::::::::::: |     5500 /     5500 |:  Job 5\n  91.33% ::::::::::::::::::::::::::::::::::::     |     8188 /     8965 |:  Job 2\n  39.85% :::::::::::::::                          |     3842 /     9642 |:  Job 7\n  34.89% :::::::::::::                            |     2882 /     8260 |:  Job 8\n  29.11% :::::::::::                              |      414 /     1422 |:  Job 9\n```\n\n#### Jupyter Notebook\n\nOn Jupyter Notebook, progress bars based on\n[ipywidgets](https://pypi.org/project/ipywidgets/) are displayed.\n\n\u003cimg src=\"https://raw.githubusercontent.com/alphatwirl/notebook-atpbar-001/v1.0.1/images/20190304_01_atpbar_jupyter.gif\" width=\"800\"\u003e\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### For more information\n\nThis is the end of the quick start tutorial. For more information, see\n[the Users Guide](https://alphatwirl.github.io/atpbar/guide/index.html).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphatwirl%2Fatpbar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falphatwirl%2Fatpbar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphatwirl%2Fatpbar/lists"}