{"id":620,"library":"click-didyoumean","title":"click-didyoumean","description":"This library enables a 'did-you-mean' suggestion feature, similar to Git, for Click-based command-line interfaces. It provides an extended `Group` and `CommandCollection` class to automatically suggest correct commands for mistyped inputs. It is currently at version 0.3.1 and is infrequently updated.","status":"active","version":"0.3.1","language":"python","source_language":"en","source_url":"https://github.com/click-contrib/click-didyoumean","tags":["click","cli","did-you-mean","command-line","ux"],"install":[{"cmd":"pip install click-didyoumean","lang":"bash","label":"Install stable version"}],"dependencies":[{"reason":"Core dependency for building command-line interfaces, which this library extends. Requires click>=7.","package":"click","optional":false}],"imports":[{"note":"Use this to add 'did-you-mean' functionality to a single Click group.","symbol":"DYMGroup","correct":"from click_didyoumean import DYMGroup"},{"note":"Use this for CLIs composed of multiple Click group sources (CommandCollection).","symbol":"DYMCommandCollection","correct":"from click_didyoumean import DYMCommandCollection"}],"quickstart":{"code":"import click\nfrom click_didyoumean import DYMGroup\n\n@click.group(cls=DYMGroup)  # Apply DYMGroup as the class for your main CLI group\ndef cli():\n    \"\"\"A simple CLI with did-you-mean suggestions.\"\"\"\n    pass\n\n@cli.command()\ndef deploy():\n    \"\"\"Deploys the application.\"\"\"\n    click.echo(\"Deploying application...\")\n\n@cli.command()\ndef delete():\n    \"\"\"Deletes resources.\"\"\"\n    click.echo(\"Deleting resources...\")\n\n@cli.command()\ndef devops():\n    \"\"\"Runs devops tasks.\"\"\"\n    click.echo(\"Running devops tasks...\")\n\nif __name__ == '__main__':\n    # Example usage (run from terminal, e.g., `python your_cli.py deplo`) will suggest `deploy`\n    cli()","lang":"python","description":"To enable the 'did-you-mean' feature, simply pass `cls=DYMGroup` to your `click.group` decorator. For more complex applications using `CommandCollection`, substitute `DYMCommandCollection`."},"warnings":[{"fix":"Instead of decorating a group, create an instance of `DYMCommandCollection` and pass your existing `click.Group` objects as `sources`. Example: `cli = DYMCommandCollection(sources=[cli1, cli2])`.","message":"When combining multiple Click group sources, you must use `DYMCommandCollection` instead of `DYMGroup`.","severity":"gotcha","affected_versions":"All versions"},{"fix":"You can configure `max_suggestions` (default 3) and `cutoff` (default 0.5) when initializing `DYMGroup` or `DYMCommandCollection` to fine-tune the suggestion behavior. For example: `@click.group(cls=DYMGroup, max_suggestions=5, cutoff=0.7)`.","message":"The default number of suggestions (max_suggestions) and similarity cutoff (cutoff) might not be ideal for all applications.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Always test `click-didyoumean` functionality after upgrading `Click` to a new major version. Keep `click-didyoumean` updated to its latest release.","message":"The library relies on Click's internal group and command handling. Major updates to Click could potentially introduce breaking changes in how these extensions integrate.","severity":"gotcha","affected_versions":"Potentially future major Click versions (e.g., Click 9.x+)"},{"fix":"Ensure your project uses Python 3.8 or newer. While older PyPI metadata might suggest Python >=3.6.2, the current development points to 3.8+.","message":"The library officially supports Python 3.8 and above, as indicated in its `pyproject.toml`.","severity":"gotcha","affected_versions":"<3.8"}],"env_vars":null,"last_verified":"2026-05-12T16:50:30.709Z","next_check":"2026-06-26T00:00:00.000Z","problems":[{"fix":"Install the package using pip: `pip install click-didyoumean`","cause":"The 'click-didyoumean' package has not been installed in your Python environment, or your Python interpreter cannot find it.","error":"ModuleNotFoundError: No module named 'click_didyoumean'"},{"fix":"Install the 'click' package: `pip install click` (This is usually installed automatically with `click-didyoumean`, but might be missing in some specific setups or if `click` was uninstalled separately).","cause":"The 'click' library, which 'click-didyoumean' depends on, is not installed or cannot be found by your Python environment.","error":"ModuleNotFoundError: No module named 'click'"},{"fix":"Ensure your Click group uses the `DYMGroup` class: `@click.group(cls=DYMGroup)` or that you are using `DYMCommandCollection` correctly for collections. Make sure you have imported `DYMGroup` or `DYMCommandCollection` from `click_didyoumean`.","cause":"This Click error appears when a command is misspelled and 'click-didyoumean' has not been correctly integrated into your Click application (e.g., by forgetting to use `cls=DYMGroup` or `DYMCommandCollection`). The library's purpose is to add 'Did you mean?' suggestions to this specific error message.","error":"Error: No such command 'mistyped_command'."}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"0.3.1","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.07,"mem_mb":2.6,"disk_size":"18.6M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2.6,"disk_size":"18.6M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.04,"mem_mb":2.6,"disk_size":"19M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.04,"mem_mb":2.6,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":3.1,"disk_size":"20.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":3.1,"disk_size":"20.5M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.7,"import_time_s":0.08,"mem_mb":3.1,"disk_size":"21M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":3.1,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":2.8,"disk_size":"12.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":2.8,"disk_size":"12.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.08,"mem_mb":2.8,"disk_size":"13M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":2.8,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":3,"disk_size":"12.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.1,"mem_mb":3,"disk_size":"12.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.08,"mem_mb":2.8,"disk_size":"13M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":2.8,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2.6,"disk_size":"18.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":2.6,"disk_size":"18.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.8,"import_time_s":0.06,"mem_mb":2.6,"disk_size":"18M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.05,"mem_mb":2.6,"disk_size":"18M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":2},{"runtime":"python:3.10-slim","exit_code":2},{"runtime":"python:3.11-alpine","exit_code":2},{"runtime":"python:3.11-slim","exit_code":2},{"runtime":"python:3.12-alpine","exit_code":2},{"runtime":"python:3.12-slim","exit_code":2},{"runtime":"python:3.13-alpine","exit_code":2},{"runtime":"python:3.13-slim","exit_code":2},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}