usecli 0.1.53__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.53 → usecli-0.1.55}/PKG-INFO +1 -1
  2. {usecli-0.1.53 → usecli-0.1.55}/pyproject.toml +1 -1
  3. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/__init__.py +41 -6
  4. {usecli-0.1.53 → usecli-0.1.55}/LICENSE +0 -0
  5. {usecli-0.1.53 → usecli-0.1.55}/README.md +0 -0
  6. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/__init__.py +0 -0
  7. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/README.md +0 -0
  8. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/__init__.py +0 -0
  9. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/custom/README.md +0 -0
  10. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/custom/__init__.py +0 -0
  11. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/__init__.py +0 -0
  12. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
  13. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
  14. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
  15. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/inspire_command.py +0 -0
  16. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
  17. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
  18. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
  19. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
  20. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
  21. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
  22. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
  23. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/commands/init_command.py +0 -0
  24. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/config/__init__.py +0 -0
  25. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/config/colors.py +0 -0
  26. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/__init__.py +0 -0
  27. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/base_command.py +0 -0
  28. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/error/__init__.py +0 -0
  29. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/error/handler.py +0 -0
  30. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/error/utils.py +0 -0
  31. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/exceptions/__init__.py +0 -0
  32. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/exceptions/base.py +0 -0
  33. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/exceptions/config.py +0 -0
  34. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/exceptions/usage.py +0 -0
  35. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/exceptions/validation.py +0 -0
  36. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/ui/__init__.py +0 -0
  37. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/ui/list.py +0 -0
  38. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/ui/title.py +0 -0
  39. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/ui/title.txt +0 -0
  40. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/validators/__init__.py +0 -0
  41. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/validators/network.py +0 -0
  42. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/validators/numeric.py +0 -0
  43. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/validators/path.py +0 -0
  44. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/core/validators/string.py +0 -0
  45. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/services/__init__.py +0 -0
  46. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/services/command_service.py +0 -0
  47. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/templates/command.py.j2 +0 -0
  48. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/templates/theme.toml.j2 +0 -0
  49. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
  50. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/ayu_dark.toml +0 -0
  51. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
  52. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
  53. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
  54. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
  55. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/default.toml +0 -0
  56. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/dracula.toml +0 -0
  57. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
  58. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/nord.toml +0 -0
  59. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/themes/tokyo_night.toml +0 -0
  60. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/utils/__init__.py +0 -0
  61. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/utils/interactive/__init__.py +0 -0
  62. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
  63. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/menu.py +0 -0
  64. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/params.py +0 -0
  65. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/shared/__init__.py +0 -0
  66. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/shared/config/__init__.py +0 -0
  67. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/shared/config/globals.py +0 -0
  68. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/shared/config/manager.py +0 -0
  69. {usecli-0.1.53 → usecli-0.1.55}/src/usecli/ui.py +0 -0
  70. {usecli-0.1.53 → 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.53
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.53"
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)
File without changes
File without changes
File without changes
File without changes
File without changes