usecli 0.1.41__tar.gz → 0.1.43__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.41 → usecli-0.1.43}/PKG-INFO +1 -1
- {usecli-0.1.41 → usecli-0.1.43}/pyproject.toml +1 -1
- usecli-0.1.43/src/usecli/cli/core/ui/title.txt +7 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/shared/config/manager.py +82 -1
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/usecli.config.toml +1 -1
- {usecli-0.1.41 → usecli-0.1.43}/LICENSE +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/README.md +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/README.md +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/custom/README.md +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/custom/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/about_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/help_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/inspire_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/internal/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/base/internal/fzf_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/core/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/core/utils.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/make/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/make/make_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/defaults/make/make_theme_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/commands/init_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/config/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/config/colors.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/base_command.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/error/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/error/handler.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/error/utils.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/exceptions/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/exceptions/base.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/exceptions/config.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/exceptions/usage.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/exceptions/validation.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/skill_generator.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/ui/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/ui/list.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/ui/title.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/validators/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/validators/network.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/validators/numeric.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/validators/path.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/core/validators/string.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/services/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/services/command_service.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/templates/command.py.j2 +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/templates/theme.toml.j2 +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/templates/usecli.config.toml.j2 +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/ayu_dark.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/catppuccin_frappe.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/catppuccin_latte.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/catppuccin_macchiato.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/catppuccin_mocha.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/default.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/dracula.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/gruvbox_dark.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/nord.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/themes/tokyo_night.toml +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/utils/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/utils/interactive/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/cli/utils/interactive/terminal_menu.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/menu.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/params.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/shared/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/shared/config/__init__.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/shared/config/globals.py +0 -0
- {usecli-0.1.41 → usecli-0.1.43}/src/usecli/ui.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "usecli"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.43"
|
|
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
|
|
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.41 → usecli-0.1.43}/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
|