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.
Files changed (70) hide show
  1. {usecli-0.1.54 → usecli-0.1.55}/PKG-INFO +1 -1
  2. {usecli-0.1.54 → usecli-0.1.55}/pyproject.toml +1 -1
  3. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/__init__.py +41 -6
  4. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/base_command.py +1 -37
  5. {usecli-0.1.54 → usecli-0.1.55}/LICENSE +0 -0
  6. {usecli-0.1.54 → usecli-0.1.55}/README.md +0 -0
  7. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/__init__.py +0 -0
  8. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/README.md +0 -0
  9. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/__init__.py +0 -0
  10. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/custom/README.md +0 -0
  11. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/custom/__init__.py +0 -0
  12. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/__init__.py +0 -0
  13. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
  14. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
  15. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
  16. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/inspire_command.py +0 -0
  17. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
  18. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
  19. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
  20. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
  21. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
  22. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
  23. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
  24. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/commands/init_command.py +0 -0
  25. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/config/__init__.py +0 -0
  26. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/config/colors.py +0 -0
  27. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/__init__.py +0 -0
  28. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/__init__.py +0 -0
  29. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/handler.py +0 -0
  30. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/error/utils.py +0 -0
  31. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/__init__.py +0 -0
  32. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/base.py +0 -0
  33. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/config.py +0 -0
  34. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/usage.py +0 -0
  35. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/exceptions/validation.py +0 -0
  36. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/__init__.py +0 -0
  37. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/list.py +0 -0
  38. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/title.py +0 -0
  39. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/ui/title.txt +0 -0
  40. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/__init__.py +0 -0
  41. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/network.py +0 -0
  42. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/numeric.py +0 -0
  43. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/path.py +0 -0
  44. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/core/validators/string.py +0 -0
  45. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/services/__init__.py +0 -0
  46. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/services/command_service.py +0 -0
  47. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/command.py.j2 +0 -0
  48. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/theme.toml.j2 +0 -0
  49. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
  50. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/ayu_dark.toml +0 -0
  51. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
  52. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
  53. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
  54. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
  55. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/default.toml +0 -0
  56. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/dracula.toml +0 -0
  57. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
  58. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/nord.toml +0 -0
  59. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/themes/tokyo_night.toml +0 -0
  60. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/__init__.py +0 -0
  61. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/interactive/__init__.py +0 -0
  62. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
  63. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/menu.py +0 -0
  64. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/params.py +0 -0
  65. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/__init__.py +0 -0
  66. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/__init__.py +0 -0
  67. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/globals.py +0 -0
  68. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/shared/config/manager.py +0 -0
  69. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/ui.py +0 -0
  70. {usecli-0.1.54 → usecli-0.1.55}/src/usecli/usecli.config.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usecli
3
- Version: 0.1.54
3
+ Version: 0.1.55
4
4
  Summary: A powerful Python CLI framework for building beautiful, developer-friendly command-line tools.
5
5
  Author: Edward Boswell
6
6
  Author-email: Edward Boswell <thememium@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usecli"
3
- version = "0.1.54"
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, Optional, Sequence
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