From 7abbccae99e1065fbb500fa665d28ef51a9ddffb Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sat, 21 Jun 2025 05:19:57 +0100 Subject: [PATCH] add RootTyperAliasGroup improve the output of projector open if the monitor index is invalid (suggests prj ls-m) fix highlight for sceneitem commands in _validate_sources() patch bump --- obsws_cli/__about__.py | 2 +- obsws_cli/alias.py | 53 ++++++++++++++++++++++++++++++++---- obsws_cli/app.py | 4 +-- obsws_cli/filter.py | 4 +-- obsws_cli/group.py | 4 +-- obsws_cli/hotkey.py | 4 +-- obsws_cli/input.py | 4 +-- obsws_cli/profile.py | 4 +-- obsws_cli/projector.py | 7 +++-- obsws_cli/record.py | 4 +-- obsws_cli/replaybuffer.py | 4 +-- obsws_cli/scene.py | 4 +-- obsws_cli/scenecollection.py | 4 +-- obsws_cli/sceneitem.py | 6 ++-- obsws_cli/screenshot.py | 4 +-- obsws_cli/stream.py | 4 +-- obsws_cli/studiomode.py | 4 +-- obsws_cli/virtualcam.py | 4 +-- 18 files changed, 84 insertions(+), 40 deletions(-) diff --git a/obsws_cli/__about__.py b/obsws_cli/__about__.py index aecbd46..83d3a11 100644 --- a/obsws_cli/__about__.py +++ b/obsws_cli/__about__.py @@ -1,4 +1,4 @@ # SPDX-FileCopyrightText: 2025-present onyx-and-iris # # SPDX-License-Identifier: MIT -__version__ = "0.17.5" +__version__ = "0.17.6" diff --git a/obsws_cli/alias.py b/obsws_cli/alias.py index 8706a93..6eefe85 100644 --- a/obsws_cli/alias.py +++ b/obsws_cli/alias.py @@ -5,8 +5,52 @@ import re import typer -class AliasGroup(typer.core.TyperGroup): - """A custom group class to handle command name aliases.""" +class RootTyperAliasGroup(typer.core.TyperGroup): + """A custom group class to handle command name aliases for the root typer.""" + + def __init__(self, *args, **kwargs): + """Initialize the AliasGroup.""" + super().__init__(*args, **kwargs) + self.no_args_is_help = True + + def get_command(self, ctx, cmd_name): + """Get a command by name.""" + match cmd_name: + case 'f': + cmd_name = 'filter' + case 'g': + cmd_name = 'group' + case 'hk': + cmd_name = 'hotkey' + case 'i': + cmd_name = 'input' + case 'prf': + cmd_name = 'profile' + case 'prj': + cmd_name = 'projector' + case 'rc': + cmd_name = 'record' + case 'rb': + cmd_name = 'replaybuffer' + case 'sc': + cmd_name = 'scene' + case 'scc': + cmd_name = 'scenecollection' + case 'si': + cmd_name = 'sceneitem' + case 'ss': + cmd_name = 'screenshot' + case 'st': + cmd_name = 'stream' + case 'sm': + cmd_name = 'studiomode' + case 'vc': + cmd_name = 'virtualcam' + return super().get_command(ctx, cmd_name) + + +class SubTyperAliasGroup(typer.core.TyperGroup): + """A custom group class to handle command name aliases for sub typers.""" _CMD_SPLIT_P = re.compile(r' ?[,|] ?') @@ -22,7 +66,6 @@ class AliasGroup(typer.core.TyperGroup): def _group_cmd_name(self, default_name): for cmd in self.commands.values(): - name = cmd.name - if name and default_name in self._CMD_SPLIT_P.split(name): - return name + if cmd.name and default_name in self._CMD_SPLIT_P.split(cmd.name): + return cmd.name return default_name diff --git a/obsws_cli/app.py b/obsws_cli/app.py index 469bb5d..c4d9e08 100644 --- a/obsws_cli/app.py +++ b/obsws_cli/app.py @@ -10,9 +10,9 @@ import typer from obsws_cli.__about__ import __version__ as obsws_cli_version from . import console, settings -from .alias import AliasGroup +from .alias import RootTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=RootTyperAliasGroup) for sub_typer in ( 'filter', 'group', diff --git a/obsws_cli/filter.py b/obsws_cli/filter.py index 431917f..f5e6612 100644 --- a/obsws_cli/filter.py +++ b/obsws_cli/filter.py @@ -7,9 +7,9 @@ import typer from rich.table import Table from . import console, util -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/group.py b/obsws_cli/group.py index e61f260..c85ea61 100644 --- a/obsws_cli/group.py +++ b/obsws_cli/group.py @@ -6,10 +6,10 @@ import typer from rich.table import Table from . import console, util, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup from .protocols import DataclassProtocol -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/hotkey.py b/obsws_cli/hotkey.py index 963c263..820d575 100644 --- a/obsws_cli/hotkey.py +++ b/obsws_cli/hotkey.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/input.py b/obsws_cli/input.py index e7ebb25..872c888 100644 --- a/obsws_cli/input.py +++ b/obsws_cli/input.py @@ -7,9 +7,9 @@ import typer from rich.table import Table from . import console, util, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/profile.py b/obsws_cli/profile.py index cd11acf..b10303c 100644 --- a/obsws_cli/profile.py +++ b/obsws_cli/profile.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console, util, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/projector.py b/obsws_cli/projector.py index dc258e0..aeb15fb 100644 --- a/obsws_cli/projector.py +++ b/obsws_cli/projector.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() @@ -74,6 +74,7 @@ def open( break else: console.err.print( - f'Monitor with index [yellow]{monitor_index}[/yellow] not found.' + f'Monitor with index [yellow]{monitor_index}[/yellow] not found. ' + f'Use [yellow]obsws-cli projector ls-m[/yellow] to see available monitors.' ) raise typer.Exit(code=1) diff --git a/obsws_cli/record.py b/obsws_cli/record.py index a516756..a4e699b 100644 --- a/obsws_cli/record.py +++ b/obsws_cli/record.py @@ -6,9 +6,9 @@ from typing import Annotated, Optional import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/replaybuffer.py b/obsws_cli/replaybuffer.py index d326d20..be80e4f 100644 --- a/obsws_cli/replaybuffer.py +++ b/obsws_cli/replaybuffer.py @@ -3,9 +3,9 @@ import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/scene.py b/obsws_cli/scene.py index ab5cb2b..02a501a 100644 --- a/obsws_cli/scene.py +++ b/obsws_cli/scene.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console, util, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/scenecollection.py b/obsws_cli/scenecollection.py index 5499a72..2af89c0 100644 --- a/obsws_cli/scenecollection.py +++ b/obsws_cli/scenecollection.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/sceneitem.py b/obsws_cli/sceneitem.py index 532be1f..9bdbccc 100644 --- a/obsws_cli/sceneitem.py +++ b/obsws_cli/sceneitem.py @@ -6,9 +6,9 @@ import typer from rich.table import Table from . import console, util, validate -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() @@ -154,7 +154,7 @@ def _validate_sources( console.err.print( f'Item [yellow]{item_name}[/yellow] not found in scene [yellow]{scene_name}[/yellow]. Is the item in a group? ' f'If so use the [yellow]--group[/yellow] option to specify the parent group.\n' - 'Use `obsws-cli sceneitem list` for a list of items in the scene.' + 'Use [yellow]obsws-cli sceneitem ls[/yellow] for a list of items in the scene.' ) return False diff --git a/obsws_cli/screenshot.py b/obsws_cli/screenshot.py index e3fc398..0c994b3 100644 --- a/obsws_cli/screenshot.py +++ b/obsws_cli/screenshot.py @@ -7,9 +7,9 @@ import obsws_python as obsws import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/stream.py b/obsws_cli/stream.py index 0262531..cc643c4 100644 --- a/obsws_cli/stream.py +++ b/obsws_cli/stream.py @@ -3,9 +3,9 @@ import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/studiomode.py b/obsws_cli/studiomode.py index ec4436f..2ed95a5 100644 --- a/obsws_cli/studiomode.py +++ b/obsws_cli/studiomode.py @@ -3,9 +3,9 @@ import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback() diff --git a/obsws_cli/virtualcam.py b/obsws_cli/virtualcam.py index 4b46594..5078ceb 100644 --- a/obsws_cli/virtualcam.py +++ b/obsws_cli/virtualcam.py @@ -3,9 +3,9 @@ import typer from . import console -from .alias import AliasGroup +from .alias import SubTyperAliasGroup -app = typer.Typer(cls=AliasGroup) +app = typer.Typer(cls=SubTyperAliasGroup) @app.callback()