usecli 0.1.54__tar.gz → 0.1.55__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.54 → usecli-0.1.55}/PKG-INFO +1 -1
- {usecli-0.1.54 → usecli-0.1.55}/pyproject.toml +1 -1
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/__init__.py +41 -6
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/base_command.py +1 -37
- {usecli-0.1.54 → usecli-0.1.55}/LICENSE +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/README.md +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/README.md +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/custom/README.md +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/custom/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/inspire_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/init_command.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/config/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/config/colors.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/handler.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/utils.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/base.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/config.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/usage.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/validation.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/list.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/title.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/title.txt +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/network.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/numeric.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/path.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/string.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/services/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/services/command_service.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/command.py.j2 +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/theme.toml.j2 +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/ayu_dark.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/default.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/dracula.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/nord.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/tokyo_night.toml +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/interactive/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/menu.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/params.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/__init__.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/globals.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/manager.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/src/usecli/ui.py +0 -0
- {usecli-0.1.54 → usecli-0.1.55}/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.55"
|
|
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" }]
|
|
@@ -4,12 +4,22 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import sys
|
|
6
6
|
from importlib import import_module
|
|
7
|
+
from typing import Any, Optional, Sequence
|
|
7
8
|
|
|
8
9
|
import click
|
|
9
10
|
import typer
|
|
10
11
|
from click.exceptions import BadParameter, ClickException, Exit, UsageError
|
|
11
12
|
from typer.core import TyperGroup
|
|
12
13
|
|
|
14
|
+
try:
|
|
15
|
+
from typer._click.exceptions import BadParameter as TyperBadParameter # type: ignore[import-untyped]
|
|
16
|
+
from typer._click.exceptions import ClickException as TyperClickException # type: ignore[import-untyped]
|
|
17
|
+
from typer._click.exceptions import UsageError as TyperUsageError # type: ignore[import-untyped]
|
|
18
|
+
except ImportError:
|
|
19
|
+
TyperBadParameter = BadParameter
|
|
20
|
+
TyperClickException = ClickException
|
|
21
|
+
TyperUsageError = UsageError
|
|
22
|
+
|
|
13
23
|
from usecli.cli.config.colors import COLOR
|
|
14
24
|
from usecli.cli.core.base_command import BaseCommand
|
|
15
25
|
from usecli.cli.core.exceptions import UsecliBadParameter, UsecliUsageError
|
|
@@ -156,6 +166,31 @@ class PrefixMatchingGroup(TyperGroup):
|
|
|
156
166
|
|
|
157
167
|
return FilteredListCommand(cmd_name)
|
|
158
168
|
|
|
169
|
+
def main(
|
|
170
|
+
self,
|
|
171
|
+
args: Optional[Sequence[str]] = None,
|
|
172
|
+
prog_name: Optional[str] = None,
|
|
173
|
+
complete_var: Optional[str] = None,
|
|
174
|
+
standalone_mode: bool = True,
|
|
175
|
+
windows_expand_args: bool = True,
|
|
176
|
+
**extra: Any,
|
|
177
|
+
) -> Any:
|
|
178
|
+
"""Override main to disable standalone mode.
|
|
179
|
+
|
|
180
|
+
Click's default standalone_mode=True catches ClickException
|
|
181
|
+
internally and calls sys.exit(), preventing our custom error
|
|
182
|
+
handlers from running. Setting standalone_mode=False lets
|
|
183
|
+
exceptions propagate to our styled error handlers in invoke().
|
|
184
|
+
"""
|
|
185
|
+
return super().main(
|
|
186
|
+
args=args,
|
|
187
|
+
prog_name=prog_name,
|
|
188
|
+
complete_var=complete_var,
|
|
189
|
+
standalone_mode=False,
|
|
190
|
+
windows_expand_args=windows_expand_args,
|
|
191
|
+
**extra,
|
|
192
|
+
)
|
|
193
|
+
|
|
159
194
|
def invoke(self, ctx: click.Context) -> None:
|
|
160
195
|
"""Invoke the group with custom error handling.
|
|
161
196
|
|
|
@@ -169,15 +204,15 @@ class PrefixMatchingGroup(TyperGroup):
|
|
|
169
204
|
return super().invoke(ctx)
|
|
170
205
|
except Exit:
|
|
171
206
|
sys.exit(0)
|
|
172
|
-
except BadParameter as e:
|
|
207
|
+
except (BadParameter, TyperBadParameter) as e:
|
|
173
208
|
styled_error = UsecliBadParameter(e.message, ctx=e.ctx, param=e.param)
|
|
174
209
|
styled_error.show()
|
|
175
210
|
sys.exit(styled_error.exit_code)
|
|
176
|
-
except UsageError as e:
|
|
211
|
+
except (UsageError, TyperUsageError) as e:
|
|
177
212
|
styled_error = UsecliUsageError(e.message, ctx=e.ctx)
|
|
178
213
|
styled_error.show()
|
|
179
214
|
sys.exit(styled_error.exit_code)
|
|
180
|
-
except ClickException as e:
|
|
215
|
+
except (ClickException, TyperClickException) as e:
|
|
181
216
|
if hasattr(e, "show"):
|
|
182
217
|
e.show()
|
|
183
218
|
sys.exit(e.exit_code if hasattr(e, "exit_code") else 1)
|
|
@@ -276,15 +311,15 @@ def main() -> None:
|
|
|
276
311
|
app()
|
|
277
312
|
except Exit:
|
|
278
313
|
sys.exit(0)
|
|
279
|
-
except BadParameter as e:
|
|
314
|
+
except (BadParameter, TyperBadParameter) as e:
|
|
280
315
|
styled_error = UsecliBadParameter(e.message, ctx=e.ctx, param=e.param)
|
|
281
316
|
styled_error.show()
|
|
282
317
|
sys.exit(styled_error.exit_code)
|
|
283
|
-
except UsageError as e:
|
|
318
|
+
except (UsageError, TyperUsageError) as e:
|
|
284
319
|
styled_error = UsecliUsageError(e.message, ctx=e.ctx)
|
|
285
320
|
styled_error.show()
|
|
286
321
|
sys.exit(styled_error.exit_code)
|
|
287
|
-
except ClickException as e:
|
|
322
|
+
except (ClickException, TyperClickException) as e:
|
|
288
323
|
if hasattr(e, "show"):
|
|
289
324
|
e.show()
|
|
290
325
|
sys.exit(e.exit_code if hasattr(e, "exit_code") else 1)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
|
-
from typing import TYPE_CHECKING, Any, ClassVar
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar
|
|
7
7
|
|
|
8
8
|
import typer
|
|
9
9
|
from click.exceptions import Exit
|
|
@@ -192,42 +192,6 @@ class CustomHelpCommand(TyperCommand):
|
|
|
192
192
|
for param in getattr(self, "params", [])
|
|
193
193
|
)
|
|
194
194
|
|
|
195
|
-
def main(
|
|
196
|
-
self,
|
|
197
|
-
args: Optional[Sequence[str]] = None,
|
|
198
|
-
prog_name: Optional[str] = None,
|
|
199
|
-
complete_var: Optional[str] = None,
|
|
200
|
-
standalone_mode: bool = True,
|
|
201
|
-
windows_expand_args: bool = True,
|
|
202
|
-
**extra: Any,
|
|
203
|
-
) -> Any:
|
|
204
|
-
"""Override main to disable standalone mode.
|
|
205
|
-
|
|
206
|
-
Click's default standalone_mode=True catches ClickException
|
|
207
|
-
internally and calls sys.exit(), preventing our custom error
|
|
208
|
-
handlers from running. Setting standalone_mode=False lets
|
|
209
|
-
exceptions propagate to our styled error handlers.
|
|
210
|
-
|
|
211
|
-
Args:
|
|
212
|
-
args: Command-line arguments.
|
|
213
|
-
prog_name: Program name for help display.
|
|
214
|
-
complete_var: Shell completion variable name.
|
|
215
|
-
standalone_mode: Must be False for custom error handling.
|
|
216
|
-
windows_expand_args: Windows argument expansion flag.
|
|
217
|
-
**extra: Additional context arguments.
|
|
218
|
-
|
|
219
|
-
Returns:
|
|
220
|
-
The command return value.
|
|
221
|
-
"""
|
|
222
|
-
return super().main(
|
|
223
|
-
args=args,
|
|
224
|
-
prog_name=prog_name,
|
|
225
|
-
complete_var=complete_var,
|
|
226
|
-
standalone_mode=False,
|
|
227
|
-
windows_expand_args=windows_expand_args,
|
|
228
|
-
**extra,
|
|
229
|
-
)
|
|
230
|
-
|
|
231
195
|
def invoke(self, ctx: ClickContext) -> Any:
|
|
232
196
|
interactive = ctx.params.pop("interactive", False)
|
|
233
197
|
if interactive:
|
|
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.54 → usecli-0.1.55}/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
|
|
File without changes
|
|
File without changes
|