{"id":16575145,"url":"https://github.com/dmyersturnbull/pocketutils","last_synced_at":"2026-01-04T03:43:03.179Z","repository":{"id":37940840,"uuid":"265950326","full_name":"dmyersturnbull/pocketutils","owner":"dmyersturnbull","description":"Everyday pocket-sized Python functions for you to copy or import.","archived":false,"fork":false,"pushed_at":"2024-09-03T22:13:03.000Z","size":822,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-12T21:46:54.377Z","etag":null,"topics":["boltons","utilities-python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmyersturnbull.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-05-21T20:58:09.000Z","updated_at":"2023-07-09T01:30:44.000Z","dependencies_parsed_at":"2024-01-17T14:59:12.507Z","dependency_job_id":null,"html_url":"https://github.com/dmyersturnbull/pocketutils","commit_stats":{"total_commits":74,"total_committers":2,"mean_commits":37.0,"dds":"0.013513513513513487","last_synced_commit":"7a4befd2afffac4534b8f72d5cae6c1403d508e8"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmyersturnbull%2Fpocketutils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmyersturnbull%2Fpocketutils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmyersturnbull%2Fpocketutils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmyersturnbull%2Fpocketutils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmyersturnbull","download_url":"https://codeload.github.com/dmyersturnbull/pocketutils/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221815183,"owners_count":16885135,"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","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":["boltons","utilities-python"],"created_at":"2024-10-11T21:46:59.935Z","updated_at":"2026-01-04T03:43:03.152Z","avatar_url":"https://github.com/dmyersturnbull.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pocketutils\n\n[![Version status](https://img.shields.io/pypi/status/pocketutils?label=status)](https://pypi.org/project/pocketutils)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Python version compatibility](https://img.shields.io/pypi/pyversions/pocketutils?label=Python)](https://pypi.org/project/pocketutils)\n[![Version on Docker Hub](https://img.shields.io/docker/v/dmyersturnbull/pocketutils?color=green\u0026label=Docker%20Hub)](https://hub.docker.com/repository/docker/dmyersturnbull/pocketutils)\n[![Version on Github](https://img.shields.io/github/v/release/dmyersturnbull/pocketutils?include_prereleases\u0026label=GitHub)](https://github.com/dmyersturnbull/pocketutils/releases)\n[![Version on PyPi](https://img.shields.io/pypi/v/pocketutils?label=PyPi)](https://pypi.org/project/pocketutils)\n[![Build (Actions)](https://img.shields.io/github/actions/workflow/status/dmyersturnbull/pocketutils/push-main.yml?label=Tests)](https://github.com/dmyersturnbull/pocketutils/actions)\n[![Documentation status](https://readthedocs.org/projects/pocketutils/badge)](https://pocketutils.readthedocs.io/en/stable/)\n[![Coverage (coveralls)](https://coveralls.io/repos/github/dmyersturnbull/pocketutils/badge.svg?branch=main\u0026service=github)](https://coveralls.io/github/dmyersturnbull/pocketutils?branch=main)\n[![Maintainability (Code Climate)](https://api.codeclimate.com/v1/badges/eea2b741dbbbb74ad18a/maintainability)](https://codeclimate.com/github/dmyersturnbull/pocketutils/maintainability)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/dmyersturnbull/pocketutils/badges/quality-score.png?b=main)](https://scrutinizer-ci.com/g/dmyersturnbull/pocketutils/?branch=main)\n\nAdorable little Python functions for you to copy or import,\n[Apache](https://spdx.org/licenses/Apache-2.0.html)-licensed.\n\n`pip install pocketutils[compression,encoding,formats,units,misc]`\n\n### Basic usage\n\n```python\nimport sys\nfrom datetime import timedelta\nfrom pocketutils import Tools, SmartIo, FrozeList, FrozeSet, FrozeDict\n\nmy_dict = FrozeDict({\"5\": \"10\"})\nhash(my_dict)\nassert my_dict == my_dict\nassert not (my_dict \u003c my_dict)  # orderable!\ninside_a_set = {my_dict}  # hashable!\n\nSmartIo.read_bytes(\"compressed.xz\")  # infers compress by filename extension\ndata = SmartIo.read_text(\"text.zst\")  # zstd, lz4, brotli, snappy, xz, ...\nSmartIo.write(data, \"compressed.zst\", atomic=True)  # atomic requires it to finish\n\nTools.zip_strict([1, 2, 3], [5, 6])  # error \u003c-- lengths must match\nTools.strip_brackets(\"( (xy)\")  # \"(xy\" \u003c-- strips paired only\nTools.sanitize_path(\"x\\ty\")  # \"xy\"  \u003c-- very robust cross-platform sanitization\nTools.delete_surefire(\"my_file\")  # \u003c-- Attempts to fix permissions if needed\nTools.git_description(\"my_repo\")  # \u003c-- get git repo info\nTools.pretty_function(lambda s: None)  # \"\u003cλ(1)\u003e \u003c-- decent name for any object\nTools.roman_to_arabic(\"XIV\")  # 14  \u003c-- inverse function too\nTools.pretty_timedelta(delta_sec=timedelta(seconds=60 * 2 + 5))  # \"02:05\"  \u003c-- handles days too\nTools.round_to_sigfigs(135.3, 2)  # \"140\"  \u003c-- rounding to sigfigs\nTools.pretty_float(-float(\"-inf\"))  # \"−∞\"  \u003c-- proper unicode, no trailing 0s\nTools.stream_cmd_call([\"cat\", \"big-file\"])  # \u003c-- buffer never fills\nTools.strip_quotes(\"'hello'\")  # \"hello\"\nTools.truncate(\"looong string\", n=10)  # \"looong st…\"\nTools.parse_bool(\"true\")  # True\nTools.parse_bool_flex(\"yes\")  # True\nTools.look(item, \"purchase.buyer.first_name\")  # None if purchase or buyer is None\nTools.friendly_size(n_bytes=2 * 14)  # \"16.38 kb\"\nTools.is_probable_null(\"NaN\")  # True\nTools.is_true_iterable(\"kitten\")  # False\nTools.or_null(lambda: None)  # None if it fails\nTools.trash(\"unwanted_file.txt\")  # move to os-specific trash\nTools.pretty_dict({\"contents\": {\"greeting\": \"hi\"}})  # indented\nTools.save_diagnostics(Tools.get_env_info())  # record diagnostic info\nTools.is_lambda(lambda: None)  # True\nTools.longest([\"a\", \"a+b\"])  # \"a+b\"  # anything with len\nTools.only([1, 2])  # error -- multiple items\nTools.first(iter([]))  # None \u003c-- better than try: next(iter(x)) except:...\nTools.trace_signals(sink=sys.stderr)  # log traceback on all signals\nTools.trace_exit(sink=sys.stderr)  # log traceback on exit\nTools.required_args(lambda a, b, c: None)  # reflection\n# lots of others\n```\n\nBetter yet, import specific sets of tools; e.g.:\n\n```python\nfrom pocketutils import FilesysTools\n\nFilesysTools.delete_surefire(\"bad-path\")\n```\n\n[See the docs 📚](https://github.io/dmyersturnbull/pocketutils), or just\n[browse the code](https://github.com/dmyersturnbull/pocketutils/tree/main/pocketutils).\n[New issues](https://github.com/dmyersturnbull/pocketutils/issues) and pull requests are welcome.\nPlease refer to the [contributing guide](https://github.com/dmyersturnbull/pocketutils/blob/main/CONTRIBUTING.md)\nand [security policy](https://github.com/dmyersturnbull/pocketutils/blob/main/SECURITY.md).\nGenerated with tyrannosaurus: `tyrannosaurus new tyrannosaurus`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmyersturnbull%2Fpocketutils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmyersturnbull%2Fpocketutils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmyersturnbull%2Fpocketutils/lists"}