{"id":13907970,"url":"https://github.com/davidfischer-ch/pytoolbox","last_synced_at":"2025-10-12T04:32:57.404Z","repository":{"id":8552487,"uuid":"10175969","full_name":"davidfischer-ch/pytoolbox","owner":"davidfischer-ch","description":"Toolbox for Python scripts.","archived":false,"fork":false,"pushed_at":"2025-09-04T14:46:48.000Z","size":7551,"stargazers_count":41,"open_issues_count":16,"forks_count":17,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-04T16:33:45.217Z","etag":null,"topics":["artificial-intelligence","aws","django","django-rest-framework","exif","ffmpeg","flask","image-processing","python","selenium-python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidfischer-ch.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.rst","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2013-05-20T15:38:43.000Z","updated_at":"2025-09-04T14:46:51.000Z","dependencies_parsed_at":"2024-01-21T23:49:52.708Z","dependency_job_id":"b725d80a-bc43-4670-99bb-3737d6655bb0","html_url":"https://github.com/davidfischer-ch/pytoolbox","commit_stats":{"total_commits":1343,"total_committers":7,"mean_commits":"191.85714285714286","dds":0.1124348473566642,"last_synced_commit":"c991c1c08b08de9283d8f28be9c372f637aa2259"},"previous_names":[],"tags_count":113,"template":false,"template_full_name":null,"purl":"pkg:github/davidfischer-ch/pytoolbox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfischer-ch%2Fpytoolbox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfischer-ch%2Fpytoolbox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfischer-ch%2Fpytoolbox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfischer-ch%2Fpytoolbox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidfischer-ch","download_url":"https://codeload.github.com/davidfischer-ch/pytoolbox/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfischer-ch%2Fpytoolbox/sbom","scorecard":{"id":326607,"data":{"date":"2025-08-11","repo":{"name":"github.com/davidfischer-ch/pytoolbox","commit":"2b46db08abef2acb5fd49667a76d1af02c4f393d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/8 approved changesets -- score normalized to 1","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":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/python-package.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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":"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/python-package.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/davidfischer-ch/pytoolbox/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/davidfischer-ch/pytoolbox/python-package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-package.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/davidfischer-ch/pytoolbox/python-package.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:32","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 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":"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":"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":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.rst:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":8,"reason":"SAST tool is not run on all commits -- score normalized to 8","details":["Warn: 21 commits out of 24 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"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2025-47 / GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: PYSEC-2025-37 / GHSA-8j24-cjrq-gr2m","Warn: Project is vulnerable to: GHSA-gw84-84pc-xp82","Warn: Project is vulnerable to: GHSA-496j-2rq6-j6cc","Warn: Project is vulnerable to: GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: GHSA-cjgq-5qmw-rcj6","Warn: Project is vulnerable to: GHSA-qr4w-53vh-m672","Warn: Project is vulnerable to: PYSEC-2023-183","Warn: Project is vulnerable to: GHSA-8qvm-5x2c-j2w7","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2023-206","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T02:37:03.174Z","repository_id":8552487,"created_at":"2025-08-18T02:37:03.174Z","updated_at":"2025-08-18T02:37:03.174Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010259,"owners_count":26084719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["artificial-intelligence","aws","django","django-rest-framework","exif","ffmpeg","flask","image-processing","python","selenium-python"],"created_at":"2024-08-06T23:02:21.744Z","updated_at":"2025-10-12T04:32:57.399Z","avatar_url":"https://github.com/davidfischer-ch.png","language":"Python","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"=========\nPytoolbox\n=========\n\n.. image:: https://badge.fury.io/py/pytoolbox.png\n   :target: http://badge.fury.io/py/pytoolbox\n\n.. image:: https://github.com/davidfischer-ch/pytoolbox/actions/workflows/python-package.yml/badge.svg\n   :target: https://github.com/davidfischer-ch/pytoolbox\n\n.. image:: https://coveralls.io/repos/davidfischer-ch/pytoolbox/badge.png\n   :target: https://coveralls.io/r/davidfischer-ch/pytoolbox\n\nAfraid of red status ? Please click on the link, sometimes this is not my fault ;-)\n\nThis module is a Toolbox for Python scripts.\n\nDocumentation: https://pytoolbox.readthedocs.org\n\nRepository: https://github.com/davidfischer-ch/pytoolbox\n\nThis library supports Python 3.11 and more recent.\n\n------------------------------------\nWhat the release number stands for ?\n------------------------------------\n\nI do my best to follow this interesting recommendation : `Semantic Versioning 2.0.0 \u003chttp://semver.org/\u003e`_\n\n-------------------\nHow to install it ?\n-------------------\n\nInstall some packages that are not handled by pip::\n\n    $ sudo apt install liblzma-dev libxml2-dev libxslt-dev libyaml-dev libz-dev\n    $ sudo apt install ffmpeg git-core python3-dev python3-gi python3-pip screen\n\nIf planning to use the `imaging` extra, especially the `exif` classes, then you'll have to install::\n\n    $ sudo apt install libcairo2 libcairo2-dev libexiv2-dev libgexiv2-dev libgirepository-2.0-dev\n\nThe gir1.2-gexiv2-0.10 should also be installed, maybe its already the case.\n\nYou may find useful to read `PyGObject's documentation \u003chttps://pygobject.readthedocs.io/en/latest/getting_started.html\u003e`_.\n\nIf planning to use the vision feature, then you have to install some requirements for dlib::\n\n    $ sudo apt install build-essential cmake pkg-config\n\nSee https://learnopencv.com/install-dlib-on-ubuntu/ for an up-to-date procedure.\n\nMake sure that pip is up-to-date (PIPception)::\n\n    $ source /some/python3/venv/bin/active\n    $ pip install --upgrade pip setuptools wheel\n\nThen, you only need to run ``setup.py``::\n\n    $ source /some/python3/venv/bin/activate\n    $ pip install .\n\n--------------------------------\nHow to enable features/modules ?\n--------------------------------\n\nExample::\n\n    $ python setup.py install --help\n\n    Common commands: (see '--help-commands' for more)\n\n      setup.py build      will build the package underneath 'build/'\n      setup.py install    will install the package\n\n    Global options:\n      --verbose (-v)  run verbosely (default)\n      --quiet (-q)    run quietly (turns verbosity off)\n      --dry-run (-n)  don't actually do anything\n      --help (-h)     show detailed help message\n      --no-user-cfg   ignore pydistutils.cfg in your home directory\n\n    Options for 'WithExtra' command:\n      ...\n      --extra-all                          Install dependencies for All Modules.\n      --extra-atlassian                    Install dependencies for Atlassian.\n      --extra-aws                          Install dependencies for AWS.\n      --extra-django                       Install dependencies for Django.\n      --extra-django-filter                Install dependencies for Django Filter.\n      --extra-django-formtools             Install dependencies for Django Form Tools.\n      --extra-flask                        Install dependencies for Flask.\n      --extra-imaging                      Install dependencies for Imaging.\n      --extra-jinja2                       Install dependencies for Jinja2.\n      --extra-mongodb                      Install dependencies for MongoDB.\n      --extra-network                      Install dependencies for Networking.\n      --extra-pandas                       Install dependencies for Pandas.\n      --extra-rest-framework               Install dependencies for Django REST Framework.\n      --extra-selenium                     Install dependencies for Selenium.\n      --extra-smpte2022                    Install dependencies for SMPTE-2022.\n      --extra-unittest                     Install dependencies for Unit Test.\n      --extra-vision                       Install dependencies for Vision.\n      --extra-voluptuous                   Install dependencies for Voluptuous.\n      --extra-doc                          Install dependencies for Pytoolbox Docs.\n      --extra-test                         Install dependencies for Pytoolbox Tests.\n\n    usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]\n       or: setup.py --help [cmd1 cmd2 ...]\n       or: setup.py --help-commands\n       or: setup.py cmd --help\n\n\n    $ python setup.py install --extra-smpte2022\n\nAnother way to do this, with ``pip``::\n\n    $ pip install -e .[django,flask,mongo,smpte2022]\n\n-----------------------\nHow to check coverage ?\n-----------------------\n\n::\n\n    $ source /some/python3/venv/bin/activate\n    $ pip install -e .[all,test]\n    $ flake8 pytoolbox\n    $ pytest\n    $ xdg-open htmlcov/index.html\n\nRemarks:\n\n* All Django related modules are excluded from tests!\n* However I am using them with Django 1.8 up to 3.1.0.\n\n---------------\nHow to use it ?\n---------------\n\nHere is an example ``hello.py`` using the cmd function provided by ``pytoolbox``::\n\n    $ from pytoolbox.subprocess import cmd\n    $ print(cmd('echo Hello World!')['stdout'])\n\n-------------------------------\nHow to generate documentation ?\n-------------------------------\n\nThe documentation is generated by `Sphinx \u003chttp://sphinx-doc.org/ext/autodoc.html\u003e`_.\nIn fact most of this documentation is extracted from the docstrings of the code.\n\nHere is the procedure::\n\n    $ source /some/python3/venv/bin/activate\n    $ pip install -e .[docs]\n    $ xdg-open docs/build/html/index.html\n\n-------------------------------------------------\nHow to add it to dependencies of my own project ?\n-------------------------------------------------\n\nHere is an example ``setup.py`` for a project called *my-cool-project*::\n\n\tfrom setuptools import setup\n\n\tsetup(\n      name='my-cool-project',\n\t\t  version='0.8',\n\t\t  author='Firstname Lastname',\n\t\t  author_email='author@something.com',\n\t\t  install_requires=['...', 'pytoolbox\u003e=14\u003c15', '...'],\n\t\t  tests_require=['...', 'pytest', '...'],\n\t\t  license='GPLv3',\n\t\t  url='https://github.com/nickname/my-cool-project',\n\t\t  packages=['my_cool_project'])\n\n\nSee `pip vcs support \u003chttp://www.pip-installer.org/en/latest/logic.html#vcs-support\u003e`_ to get further details about this.\n\nYou also need to install ``git-core``, but it is probably already the case, at least on your development computer ;-)\n\n2012 - 2025 David Fischer\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidfischer-ch%2Fpytoolbox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidfischer-ch%2Fpytoolbox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidfischer-ch%2Fpytoolbox/lists"}