- Enhanced error messages when version cannot be determined, providing clearer guidance. - Added explicit handling for missing pyproject.toml and TOML parsing errors. - Improved user feedback for installation corruption issues.
110 lines
3.6 KiB
Python
110 lines
3.6 KiB
Python
from pathlib import Path
|
|
from typing import Annotated
|
|
|
|
import toml
|
|
import typer
|
|
|
|
from devgen.cli.changelog import app as changelog_app
|
|
from devgen.cli.commit import app as commit_app
|
|
from devgen.cli.config import app as config_app
|
|
from devgen.cli.gitignore import app as gitignore_app
|
|
from devgen.cli.license import app as license_app
|
|
from devgen.cli.release import app as release_app
|
|
from devgen.cli.setup import app as setup_app
|
|
|
|
app = typer.Typer(
|
|
name="devgen",
|
|
help="devgen-py: AI-Powered Git Commit & Release Automation.",
|
|
add_completion=True,
|
|
no_args_is_help=True,
|
|
rich_markup_mode="markdown",
|
|
)
|
|
|
|
|
|
def _version_callback(value: bool) -> None:
|
|
"""Displays the application version retrieved from pyproject.toml if the input value is True, then exits the program. If the version information cannot be found or the file is missing or malformed, outputs an error message before exiting.
|
|
|
|
Args:
|
|
value (bool): A boolean flag indicating whether to display the version and exit.
|
|
|
|
Returns:
|
|
None
|
|
|
|
Raises:
|
|
typer.Exit: Exits the program after attempting to display the version or an error message.
|
|
"""
|
|
if value:
|
|
try:
|
|
pyproject_path = Path(__file__).parent.parent.parent / "pyproject.toml"
|
|
pyproject_data = toml.load(pyproject_path)
|
|
# Try standard PEP 621 first, then fallback
|
|
version = pyproject_data.get("project", {}).get("version")
|
|
if not version:
|
|
version = (
|
|
pyproject_data.get("tool", {}).get("poetry", {}).get("version")
|
|
)
|
|
|
|
if version:
|
|
typer.echo(f"devgen version: {version}")
|
|
else:
|
|
typer.secho(
|
|
"Could not determine version: no `project.version` or "
|
|
"`tool.poetry.version` found in pyproject.toml.",
|
|
fg=typer.colors.RED,
|
|
err=True,
|
|
)
|
|
except FileNotFoundError:
|
|
typer.secho(
|
|
f"pyproject.toml not found at {pyproject_path}. "
|
|
"The installation may be corrupt.",
|
|
fg=typer.colors.RED,
|
|
err=True,
|
|
)
|
|
except toml.TomlDecodeError as e:
|
|
typer.secho(
|
|
f"pyproject.toml is not valid TOML: {e}",
|
|
fg=typer.colors.RED,
|
|
err=True,
|
|
)
|
|
raise typer.Exit()
|
|
|
|
|
|
@app.callback()
|
|
def main_callback(
|
|
version: Annotated[
|
|
bool | None,
|
|
typer.Option(
|
|
"--version",
|
|
"-v",
|
|
callback=_version_callback,
|
|
is_eager=True,
|
|
help="Show the application version and exit.",
|
|
),
|
|
] = None,
|
|
) -> None:
|
|
"""Displays the application version information when the --version or -v option is used. If the flag is set, shows the version and exits; otherwise, provides guidance on using other commands with devgen.
|
|
|
|
Args:
|
|
version (bool or None, optional): A flag indicating whether to display the application version, set via command-line options --version or -v. Defaults to None.
|
|
|
|
Returns:
|
|
None
|
|
"""
|
|
pass
|
|
|
|
|
|
app.add_typer(commit_app, name="commit")
|
|
app.add_typer(setup_app, name="setup")
|
|
app.add_typer(changelog_app, name="changelog")
|
|
app.add_typer(license_app, name="license")
|
|
app.add_typer(gitignore_app, name="gitignore")
|
|
app.add_typer(release_app, name="release")
|
|
app.add_typer(config_app, name="config")
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
app()
|
|
except KeyboardInterrupt:
|
|
print("\n\n Operation cancelled by user.")
|
|
raise typer.Exit(code=130)
|