usecli 0.1.41__tar.gz → 0.1.42__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.41 → usecli-0.1.42}/PKG-INFO +1 -1
  2. {usecli-0.1.41 → usecli-0.1.42}/pyproject.toml +1 -1
  3. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/shared/config/manager.py +82 -1
  4. {usecli-0.1.41 → usecli-0.1.42}/LICENSE +0 -0
  5. {usecli-0.1.41 → usecli-0.1.42}/README.md +0 -0
  6. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/__init__.py +0 -0
  7. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/__init__.py +0 -0
  8. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/README.md +0 -0
  9. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/__init__.py +0 -0
  10. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/custom/README.md +0 -0
  11. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/custom/__init__.py +0 -0
  12. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/__init__.py +0 -0
  13. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
  14. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
  15. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
  16. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/inspire_command.py +0 -0
  17. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
  18. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
  19. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
  20. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
  21. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
  22. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
  23. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
  24. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/commands/init_command.py +0 -0
  25. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/config/__init__.py +0 -0
  26. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/config/colors.py +0 -0
  27. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/__init__.py +0 -0
  28. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/base_command.py +0 -0
  29. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/error/__init__.py +0 -0
  30. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/error/handler.py +0 -0
  31. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/error/utils.py +0 -0
  32. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/exceptions/__init__.py +0 -0
  33. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/exceptions/base.py +0 -0
  34. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/exceptions/config.py +0 -0
  35. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/exceptions/usage.py +0 -0
  36. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/exceptions/validation.py +0 -0
  37. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/skill_generator.py +0 -0
  38. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/ui/__init__.py +0 -0
  39. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/ui/list.py +0 -0
  40. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/ui/title.py +0 -0
  41. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/validators/__init__.py +0 -0
  42. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/validators/network.py +0 -0
  43. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/validators/numeric.py +0 -0
  44. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/validators/path.py +0 -0
  45. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/core/validators/string.py +0 -0
  46. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/services/__init__.py +0 -0
  47. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/services/command_service.py +0 -0
  48. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/templates/command.py.j2 +0 -0
  49. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/templates/theme.toml.j2 +0 -0
  50. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
  51. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/ayu_dark.toml +0 -0
  52. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
  53. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
  54. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
  55. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
  56. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/default.toml +0 -0
  57. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/dracula.toml +0 -0
  58. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
  59. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/nord.toml +0 -0
  60. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/themes/tokyo_night.toml +0 -0
  61. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/utils/__init__.py +0 -0
  62. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/utils/interactive/__init__.py +0 -0
  63. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
  64. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/menu.py +0 -0
  65. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/params.py +0 -0
  66. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/shared/__init__.py +0 -0
  67. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/shared/config/__init__.py +0 -0
  68. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/shared/config/globals.py +0 -0
  69. {usecli-0.1.41 → usecli-0.1.42}/src/usecli/ui.py +0 -0
  70. {usecli-0.1.41 → usecli-0.1.42}/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.41
3
+ Version: 0.1.42
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.41"
3
+ version = "0.1.42"
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" }]
@@ -195,10 +195,14 @@ class ConfigManager:
195
195
  @classmethod
196
196
  def _find_usecli_config(cls, start_dir: Path) -> Path | None:
197
197
  current = start_dir.resolve()
198
+ command_name = cls._get_command_name()
199
+ aliases = cls._get_console_script_aliases(command_name)
198
200
 
199
201
  while True:
200
202
  config_path = current / USECLI_CONFIG_TOML
201
- if config_path.exists():
203
+ if config_path.exists() and cls._config_matches_command(
204
+ config_path, command_name, aliases
205
+ ):
202
206
  return config_path
203
207
 
204
208
  parent = current.parent
@@ -240,6 +244,14 @@ class ConfigManager:
240
244
  for path in candidates
241
245
  if not any(part in ConfigManager._SKIP_DIRS for part in path.parts)
242
246
  ]
247
+ command_name = ConfigManager._get_command_name()
248
+ aliases = ConfigManager._get_console_script_aliases(command_name)
249
+ if command_name:
250
+ candidates = [
251
+ path
252
+ for path in candidates
253
+ if ConfigManager._config_matches_command(path, command_name, aliases)
254
+ ]
243
255
  if not candidates:
244
256
  return None
245
257
 
@@ -277,6 +289,16 @@ class ConfigManager:
277
289
  candidates = [
278
290
  path for path in package_root.rglob(USECLI_CONFIG_TOML) if path.exists()
279
291
  ]
292
+ command_name = ConfigManager._get_command_name()
293
+ aliases = ConfigManager._get_console_script_aliases(command_name)
294
+ if command_name:
295
+ candidates = [
296
+ path
297
+ for path in candidates
298
+ if ConfigManager._config_matches_command(
299
+ path, command_name, aliases
300
+ )
301
+ ]
280
302
  if candidates:
281
303
  candidates.sort(key=lambda path: (len(path.parts), str(path)))
282
304
  return candidates[0]
@@ -296,6 +318,14 @@ class ConfigManager:
296
318
  candidates = [
297
319
  path for path in package_root.rglob(USECLI_CONFIG_TOML) if path.exists()
298
320
  ]
321
+ command_name = cls._get_command_name()
322
+ aliases = cls._get_console_script_aliases(command_name)
323
+ if command_name:
324
+ candidates = [
325
+ path
326
+ for path in candidates
327
+ if cls._config_matches_command(path, command_name, aliases)
328
+ ]
299
329
  if candidates:
300
330
  candidates.sort(key=lambda path: (len(path.parts), str(path)))
301
331
  return candidates[0]
@@ -390,6 +420,57 @@ class ConfigManager:
390
420
 
391
421
  return {}
392
422
 
423
+ @staticmethod
424
+ def _get_command_name() -> str | None:
425
+ if not sys.argv:
426
+ return None
427
+ command = os.path.basename(sys.argv[0])
428
+ return command if command else None
429
+
430
+ @staticmethod
431
+ def _get_console_script_aliases(command_name: str | None) -> set[str]:
432
+ if not command_name:
433
+ return set()
434
+ aliases: set[str] = {command_name}
435
+ try:
436
+ distributions = importlib.metadata.distributions()
437
+ except Exception:
438
+ return aliases
439
+ for dist in distributions:
440
+ try:
441
+ entry_points = dist.entry_points
442
+ except Exception:
443
+ continue
444
+ names = [
445
+ entry_point.name
446
+ for entry_point in entry_points
447
+ if entry_point.group == "console_scripts"
448
+ ]
449
+ if command_name in names:
450
+ aliases.update(names)
451
+ break
452
+ return aliases
453
+
454
+ @staticmethod
455
+ def _config_matches_command(
456
+ path: Path, command_name: str | None, aliases: set[str] | None = None
457
+ ) -> bool:
458
+ if command_name is None:
459
+ return True
460
+ try:
461
+ config = ConfigManager._load_usecli_toml(path)
462
+ except (tomllib.TOMLDecodeError, OSError):
463
+ return True
464
+ config_command = config.get("command_name")
465
+ if not isinstance(config_command, str):
466
+ return True
467
+ normalized = config_command.strip()
468
+ if not normalized:
469
+ return True
470
+ if aliases is None:
471
+ aliases = {command_name}
472
+ return normalized in aliases
473
+
393
474
  def get(self, key: str, default: Any = None) -> Any:
394
475
  """Get a configuration value using dot notation.
395
476
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes