From e2b4b49f983de541a12b25bb9c3b79e45b7d1609 Mon Sep 17 00:00:00 2001 From: Brent O'Connor Date: Sun, 20 Oct 2024 14:25:41 -0500 Subject: [PATCH] Switch to using Typer instead of Argparse --- pyproject.toml | 1 + src/dj_beat_drop/main_cli.py | 89 +++++++++++++++++++----------------- src/dj_beat_drop/utils.py | 10 +++- uv.lock | 82 +++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3ff2593..6f3cf48 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "inquirerpy>=0.3.4", "requests>=2.32.3", "setuptools>=75.1.0", + "typer>=0.12.5", ] [build-system] diff --git a/src/dj_beat_drop/main_cli.py b/src/dj_beat_drop/main_cli.py index 6ec1880..325b0e9 100644 --- a/src/dj_beat_drop/main_cli.py +++ b/src/dj_beat_drop/main_cli.py @@ -1,7 +1,8 @@ -import argparse +import importlib.metadata import requests -from pkg_resources import get_distribution, parse_version +import typer +from packaging.version import parse from dj_beat_drop.new import handle_new from dj_beat_drop.utils import color @@ -9,23 +10,35 @@ def get_ascii_logo(): logo = r""" - ___ __ ___ __ ___ - / _ \__ / / / _ )___ ___ _/ /_ / _ \_______ ___ + ___ __ ___ __ ___ + / _ \__ / / / _ )___ ___ _/ /_ / _ \_______ ___ / // / // / / _ / -_) _ `/ __/ / // / __/ _ \/ _ \ /____/\___/ /____/\__/\_,_/\__/ /____/_/ \___/ .__/ - /_/ -""" + /_/ """ return logo +def get_current_version(): + return importlib.metadata.version("dj-beat-drop") + + +main_command = typer.Typer(no_args_is_help=True) + + +def print_version(value: bool): + if value: + print(f"Version {get_current_version()}") + raise typer.Exit() + + def check_version(): package_name = "dj-beat-drop" - current_version = get_distribution(package_name).version + current_version = get_current_version() response = requests.get(f"https://pypi.org/pypi/{package_name}/json", timeout=10) latest_version = response.json()["info"]["version"] - if parse_version(current_version) < parse_version(latest_version): + if parse(current_version) < parse(latest_version): color.green( f"\033[0;33m\nA new version of {package_name} is available ({latest_version}). You are using " f"{current_version}. To update, run:\n\033[0m" @@ -33,43 +46,33 @@ def check_version(): print(f" pip install --upgrade {package_name}\n") +@main_command.callback() +def main_callback( + version: bool = typer.Option( + None, + "--version", + "-v", + callback=print_version, + is_eager=True, + help="Show the application's version and exit.", + ), +): + pass + + +@main_command.command() +def new( + name: str | None = typer.Argument(None, help="Project name (e.g. 'example_project' or 'example-project')."), + use_lts: bool = typer.Option(False, "--lts", help="Use the latest LTS version of Django."), + overwrite: bool = typer.Option(False, "--overwrite", help="Overwrite the project directory if it already exists."), +): + handle_new(name, use_lts, overwrite) + + def main(): - print(f"\033[38;2;255;165;0m{get_ascii_logo()}\033[0m") + color.orange(get_ascii_logo()) check_version() - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--version", - action="version", - version=f"Version {get_distribution('dj-beat-drop').version}", - ) - subparsers = parser.add_subparsers(dest="command") - - # Add 'new' subcommand - new_parser = subparsers.add_parser("new", help="Create a new Django project.") - new_parser.add_argument( - "name", - type=str, - nargs="?", - help="Project name (e.g. 'example_project' or 'example-project').", - ) - new_parser.add_argument( - "--lts", - action="store_true", - help="Use the latest LTS version of Django.", - ) - new_parser.add_argument( - "--overwrite", - action="store_true", - help="Overwrite the project directory if it already exists.", - ) - - args = parser.parse_args() - - if args.command == "new": - handle_new(args.name, args.lts, args.overwrite) - else: - parser.print_help() + main_command() if __name__ == "__main__": diff --git a/src/dj_beat_drop/utils.py b/src/dj_beat_drop/utils.py index 1a36ad6..2d6b1a1 100644 --- a/src/dj_beat_drop/utils.py +++ b/src/dj_beat_drop/utils.py @@ -5,13 +5,19 @@ class Color: + ESCAPE = "\033[0m" + @staticmethod def green(text): - print(f"\033[92m{text}\033[0m") + print(f"\033[92m{text}{Color.ESCAPE}") @staticmethod def red(text): - print(f"\033[91m{text}\033[0m") + print(f"\033[91m{text}{Color.ESCAPE}") + + @staticmethod + def orange(text): + print(f"\033[38;2;255;165;0m{text}{Color.ESCAPE}") color = Color() diff --git a/uv.lock b/uv.lock index 291fe25..473a957 100644 --- a/uv.lock +++ b/uv.lock @@ -102,6 +102,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -183,6 +195,7 @@ dependencies = [ { name = "inquirerpy" }, { name = "requests" }, { name = "setuptools" }, + { name = "typer" }, ] [package.dev-dependencies] @@ -198,6 +211,7 @@ requires-dist = [ { name = "inquirerpy", specifier = ">=0.3.4" }, { name = "requests", specifier = ">=2.32.3" }, { name = "setuptools", specifier = ">=75.1.0" }, + { name = "typer", specifier = ">=0.12.5" }, ] [package.metadata.requires-dev] @@ -261,6 +275,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/37/2351e48cb3309673492d3a8c59d407b75fb6630e560eb27ecd4da03adc9a/lsprotocol-2023.0.1-py3-none-any.whl", hash = "sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2", size = 70826 }, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + [[package]] name = "packaging" version = "24.1" @@ -313,6 +348,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/19/b74a10dd24548e96e8c80226cbacb28b021bc3a168a7d2709fb0d0185348/pygls-1.3.1-py3-none-any.whl", hash = "sha256:6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e", size = 56031 }, ] +[[package]] +name = "pygments" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, +] + [[package]] name = "pytest" version = "8.3.3" @@ -358,6 +402,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "rich" +version = "13.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117 }, +] + [[package]] name = "ruff" version = "0.6.9" @@ -408,6 +466,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2", size = 1248506 }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + [[package]] name = "tomli" version = "2.0.2" @@ -417,6 +484,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 }, ] +[[package]] +name = "typer" +version = "0.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/58/a79003b91ac2c6890fc5d90145c662fd5771c6f11447f116b63300436bc9/typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722", size = 98953 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/2b/886d13e742e514f704c33c4caa7df0f3b89e5a25ef8db02aa9ca3d9535d5/typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b", size = 47288 }, +] + [[package]] name = "typing-extensions" version = "4.12.2"