usecli 0.1.48__tar.gz → 0.1.50__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {usecli-0.1.48 → usecli-0.1.50}/PKG-INFO +1 -1
- {usecli-0.1.48 → usecli-0.1.50}/pyproject.toml +1 -1
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/inspire_command.py +8 -3
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/base_command.py +8 -7
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/ui/list.py +15 -3
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/templates/command.py.j2 +1 -1
- {usecli-0.1.48 → usecli-0.1.50}/LICENSE +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/README.md +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/README.md +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/custom/README.md +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/custom/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/init_command.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/config/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/config/colors.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/error/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/error/handler.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/error/utils.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/exceptions/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/exceptions/base.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/exceptions/config.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/exceptions/usage.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/exceptions/validation.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/ui/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/ui/title.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/ui/title.txt +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/validators/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/validators/network.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/validators/numeric.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/validators/path.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/core/validators/string.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/services/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/services/command_service.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/templates/theme.toml.j2 +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/ayu_dark.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/default.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/dracula.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/nord.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/themes/tokyo_night.toml +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/utils/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/utils/interactive/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/menu.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/params.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/shared/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/shared/config/__init__.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/shared/config/globals.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/shared/config/manager.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/ui.py +0 -0
- {usecli-0.1.48 → usecli-0.1.50}/src/usecli/usecli.config.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "usecli"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.50"
|
|
4
4
|
description = "A powerful Python CLI framework for building beautiful, developer-friendly command-line tools."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [{ name = "Edward Boswell", email = "thememium@gmail.com" }]
|
|
@@ -33,9 +33,14 @@ class InspireCommand(BaseCommand):
|
|
|
33
33
|
def handle(self) -> None:
|
|
34
34
|
"""Handle the command execution."""
|
|
35
35
|
try:
|
|
36
|
-
|
|
37
|
-
"https://zenquotes.io/api/random/inspiration"
|
|
38
|
-
|
|
36
|
+
req = urllib.request.Request(
|
|
37
|
+
"https://zenquotes.io/api/random/inspiration",
|
|
38
|
+
headers={
|
|
39
|
+
"User-Agent": "Mozilla/5.0 (compatible; usecli/1.0)",
|
|
40
|
+
"Accept": "application/json",
|
|
41
|
+
},
|
|
42
|
+
)
|
|
43
|
+
with urllib.request.urlopen(req, timeout=10) as response:
|
|
39
44
|
data: list[dict[str, str]] = json.loads(response.read().decode())
|
|
40
45
|
quote = data[0]["q"]
|
|
41
46
|
author = data[0]["a"]
|
|
@@ -6,10 +6,9 @@ from abc import ABC, abstractmethod
|
|
|
6
6
|
from typing import TYPE_CHECKING, Any, ClassVar
|
|
7
7
|
|
|
8
8
|
import typer
|
|
9
|
-
from click import Argument, Option
|
|
10
9
|
from click.exceptions import Exit
|
|
11
10
|
from rich.console import Console
|
|
12
|
-
from typer.core import TyperCommand
|
|
11
|
+
from typer.core import TyperArgument, TyperCommand, TyperOption
|
|
13
12
|
|
|
14
13
|
from usecli.cli.config.colors import COLOR
|
|
15
14
|
from usecli.cli.core.ui.title import get_script_command_name
|
|
@@ -179,8 +178,8 @@ class CustomHelpCommand(TyperCommand):
|
|
|
179
178
|
self.params = []
|
|
180
179
|
if not self._has_interactive_option():
|
|
181
180
|
self.params.append(
|
|
182
|
-
|
|
183
|
-
["--interactive", "-i"],
|
|
181
|
+
TyperOption(
|
|
182
|
+
param_decls=["--interactive", "-i"],
|
|
184
183
|
is_flag=True,
|
|
185
184
|
help="Run in interactive mode.",
|
|
186
185
|
)
|
|
@@ -188,7 +187,7 @@ class CustomHelpCommand(TyperCommand):
|
|
|
188
187
|
|
|
189
188
|
def _has_interactive_option(self) -> bool:
|
|
190
189
|
return any(
|
|
191
|
-
isinstance(param,
|
|
190
|
+
isinstance(param, TyperOption)
|
|
192
191
|
and ("--interactive" in param.opts or "-i" in param.opts)
|
|
193
192
|
for param in getattr(self, "params", [])
|
|
194
193
|
)
|
|
@@ -217,10 +216,12 @@ class CustomHelpCommand(TyperCommand):
|
|
|
217
216
|
Raises:
|
|
218
217
|
Exit: After displaying help.
|
|
219
218
|
"""
|
|
220
|
-
arguments = [p for p in self.params if isinstance(p,
|
|
219
|
+
arguments = [p for p in self.params if isinstance(p, TyperArgument)]
|
|
221
220
|
argument_names = [p.name for p in arguments if p.name]
|
|
222
221
|
options = [
|
|
223
|
-
p
|
|
222
|
+
p
|
|
223
|
+
for p in self.params
|
|
224
|
+
if isinstance(p, TyperOption) and "--help" not in p.opts
|
|
224
225
|
]
|
|
225
226
|
|
|
226
227
|
arg_usage = " ".join(rf"\[{name.upper()}]" for name in argument_names)
|
|
@@ -23,6 +23,17 @@ console = Console()
|
|
|
23
23
|
SPACER_LENGTH = 6
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
def _is_click_group(obj: object) -> bool:
|
|
27
|
+
"""Check if an object is a Click group (has subcommands).
|
|
28
|
+
|
|
29
|
+
Works with both standard click.Group and Typer's vendored click
|
|
30
|
+
(TyperGroup in typer>=0.26 no longer extends click.Group directly).
|
|
31
|
+
"""
|
|
32
|
+
return isinstance(obj, click.Group) or (
|
|
33
|
+
hasattr(obj, "commands") and isinstance(getattr(obj, "commands", None), dict)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
26
37
|
class CommandEntry(TypedDict):
|
|
27
38
|
name: str
|
|
28
39
|
display_name: str
|
|
@@ -87,9 +98,10 @@ def list_commands(app: typer.Typer, prefix_filter: str | None = None) -> None:
|
|
|
87
98
|
commands.sort(key=lambda x: x["name"])
|
|
88
99
|
|
|
89
100
|
groups: dict[str, str] = {}
|
|
90
|
-
if
|
|
91
|
-
|
|
92
|
-
|
|
101
|
+
if _is_click_group(click_group):
|
|
102
|
+
sub_commands: dict[str, object] = getattr(click_group, "commands", {})
|
|
103
|
+
for cmd_name, cmd_obj in sub_commands.items():
|
|
104
|
+
if _is_click_group(cmd_obj):
|
|
93
105
|
if (
|
|
94
106
|
cmd_name in group_alias_to_primary
|
|
95
107
|
and group_alias_to_primary[cmd_name] != cmd_name
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{usecli-0.1.48 → usecli-0.1.50}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|