{"id":15374785,"url":"https://github.com/mondeja/importlib-metadata-argparse-version","last_synced_at":"2026-02-07T01:32:06.023Z","repository":{"id":37739898,"uuid":"500401242","full_name":"mondeja/importlib-metadata-argparse-version","owner":"mondeja","description":"Python's argparse version action to define CLI version with a delayed call to importlib.metadata","archived":false,"fork":false,"pushed_at":"2024-07-01T03:02:34.000Z","size":25,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-05T06:51:06.106Z","etag":null,"topics":["argparse","cli","importlib","metadata","python","version"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mondeja.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":"2022-06-06T11:13:31.000Z","updated_at":"2023-12-31T06:28:53.000Z","dependencies_parsed_at":"2024-02-23T11:50:13.072Z","dependency_job_id":null,"html_url":"https://github.com/mondeja/importlib-metadata-argparse-version","commit_stats":{"total_commits":6,"total_committers":2,"mean_commits":3.0,"dds":"0.16666666666666663","last_synced_commit":"2095460138c948205e198a776dd5fb3df9b6c546"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondeja%2Fimportlib-metadata-argparse-version","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondeja%2Fimportlib-metadata-argparse-version/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondeja%2Fimportlib-metadata-argparse-version/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondeja%2Fimportlib-metadata-argparse-version/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mondeja","download_url":"https://codeload.github.com/mondeja/importlib-metadata-argparse-version/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219843079,"owners_count":16556591,"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":["argparse","cli","importlib","metadata","python","version"],"created_at":"2024-10-01T13:59:45.353Z","updated_at":"2026-02-07T01:32:06.016Z","avatar_url":"https://github.com/mondeja.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `importlib-metadata-argparse-version`\n\n[![PyPI][pypi-version-badge-link]][pypi-link]\n[![Python versions][pypi-pyversions-badge-link]][pypi-link]\n[![License][license-image]][license-link]\n[![Tests][tests-image]][tests-link]\n[![Coverage status][coverage-image]][coverage-link]\n\nPython's [`argparse`] module action to define CLI version with a delayed\ncall to [`importlib.metadata.version`] only when `--version` argument\nis passed.\n\n## Rationale\n\nWhen you use `importlib.metadata` for adding the version to a CLI utility,\nyou need to import `importlib.metadata` and call\n`importlib.metadata.version(\"\u003cyour-package\u003e\")` at initialization time.\nIf you only want to execute other parts of the CLI\n(eg. like passing the option `--help`), `importlib.metadata` will be\nimported too even when is not needed at all.\n\nThe problem is easily fixed by this module.\n\n## Usage\n\n```python\nimport argparse\n\nfrom importlib_metadata_argparse_version import ImportlibMetadataVersionAction\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\n    \"-v\", \"--version\",\n    action=ImportlibMetadataVersionAction,\n    version_from=\"your-package-name\",\n)\n```\n\nThis is a rough equivalent to something like:\n\n```python\nimport argparse\nimport importlib.metadata\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\n    \"-v\", \"--version\",\n    action=\"version\",\n    version=importlib_metadata.version(\"your-package-name\"),\n)\n```\n\n...but with the difference that `importlib.metadata` will only be\nimported when you call `--version`, so it is more efficient.\n\nWhen using `ImportlibMetadataVersionAction` the `version` kwarg\naccepts `%(version)s` as a placeholder like `%(prog)s`. So you\ncan write something like this to display the program name before the\nversion:\n\n```python\nparser.add_argument(\n    \"-v\", \"--version\",\n    action=ImportlibMetadataVersionAction,\n    version_from=\"your-package-name\",\n    version=\"%(prog)s %(version)s\",\n)\n\n# or\n\nparser.version = \"%(prog)s %(version)s\"\nparser.add_argument(\n    \"-v\", \"--version\",\n    action=ImportlibMetadataVersionAction,\n    version_from=\"your-package-name\",\n)\n```\n\nAnd the `version` kwarg becomes optional, being `\"%(version)s\"`\nthe default value.\n\n### Infer package name\n\nThe argument `version_from` can be ommitted and the package name\nwill be inferred from the caller package location:\n\n```python\nparser.add_argument(\n    \"-v\", \"--version\",\n    action=ImportlibMetadataVersionAction,\n)\n```\n\n## For convenience\n\nIf you forget to define the kwarg `version_from` in the argument or the\ninferred package name is not found, an exception will be raised at\ninitialization time. Python's [`argparse`] built-in `\"version\"` action raises\nan `AttributeError` **only when you call your program with `--version`**, which\nis unsafe because could lead you to forget to define the `version` passing\nthe error unnoticed until you test it manually.\n\n[`argparse`]: https://docs.python.org/3/library/argparse.html\n[`importlib.metadata.version`]: https://docs.python.org/3/library/importlib.metadata.html?highlight=importlib%20metadata#distribution-versions\n[pypi-link]: https://pypi.org/project/importlib-metadata-argparse-version\n[pypi-version-badge-link]: https://img.shields.io/pypi/v/importlib-metadata-argparse-version?logo=pypi\u0026logoColor=white\n[pypi-pyversions-badge-link]: https://img.shields.io/pypi/pyversions/importlib-metadata-argparse-version?logo=python\u0026logoColor=white\n[license-image]: https://img.shields.io/pypi/l/importlib-metadata-argparse-version?color=light-green\u0026logo=freebsd\u0026logoColor=white\n[license-link]: https://github.com/mondeja/importlib-metadata-argparse-version/blob/master/LICENSE\n[tests-image]: https://img.shields.io/github/actions/workflow/status/mondeja/importlib-metadata-argparse-version/ci.yml?logo=github\u0026label=tests\u0026branch=master\n[tests-link]: https://github.com/mondeja/importlib-metadata-argparse-version/actions?query=workflow%3ACI\n[coverage-image]: https://img.shields.io/codecov/c/github/mondeja/importlib-metadata-argparse-version?logo=codecov\u0026logoColor=white\n[coverage-link]: https://app.codecov.io/gh/mondeja/importlib-metadata-argparse-version\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmondeja%2Fimportlib-metadata-argparse-version","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmondeja%2Fimportlib-metadata-argparse-version","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmondeja%2Fimportlib-metadata-argparse-version/lists"}