From 908f139388ba8d5949b4ab151655eca266854894 Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Sun, 22 Feb 2026 18:51:59 +0330 Subject: [PATCH 1/6] fix : __init__.py import updated --- nava/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nava/__init__.py b/nava/__init__.py index 8d44578..f501ca8 100644 --- a/nava/__init__.py +++ b/nava/__init__.py @@ -8,3 +8,5 @@ atexit.register(stop_all) __version__ = NAVA_VERSION + +__all__ = ["Engine", "NavaBaseError", "play", "stop", "stop_all"] From ac8583ceaedde5f9fbb7c453f64f8fea5e2db9a7 Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Sun, 22 Feb 2026 19:03:18 +0330 Subject: [PATCH 2/6] fix : CLI section modified --- nava/__main__.py | 26 +++++++++++++++++++++----- nava/params.py | 2 ++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/nava/__main__.py b/nava/__main__.py index 9f563bf..c3c021b 100644 --- a/nava/__main__.py +++ b/nava/__main__.py @@ -2,12 +2,11 @@ """Nava main.""" import argparse from art import tprint -from .params import NAVA_VERSION +from .params import NAVA_VERSION, EXIT_MESSAGE from .functions import nava_help, play_cli - -def main() -> None: - """CLI main function.""" +def parse_args() -> argparse.Namespace: + """Parse arguments.""" parser = argparse.ArgumentParser() parser.add_argument( 'filename', @@ -27,6 +26,15 @@ def main() -> None: parser.add_argument('--version', help="version", action='store_true', default=False) parser.add_argument('-v', help="version", action='store_true', default=False) args = parser.parse_known_args()[0] + return args + + +def run(args: argparse.Namespace) -> None: + """ + Run nava CLI. + + :param args: arguments + """ if args.version or args.v: print(NAVA_VERSION) elif args.filename or args.file: @@ -39,8 +47,16 @@ def main() -> None: tprint("Nava") tprint("V:" + NAVA_VERSION) nava_help() - parser.print_help() +def main() -> None: + """CLI main function.""" + try: + args = parse_args() + run(args) + except (KeyboardInterrupt, EOFError): + print(EXIT_MESSAGE) + + if __name__ == "__main__": main() diff --git a/nava/params.py b/nava/params.py index 9479559..48de32b 100644 --- a/nava/params.py +++ b/nava/params.py @@ -55,5 +55,7 @@ class PythonEnvironment(Enum): LOOP_ASYNC_ERROR = "`loop` can not be set True when `async_mode` is False." ENGINE_TYPE_ERROR = "`engine` type must be `Engine` enum." +EXIT_MESSAGE = "See you. Bye!" + _play_threads_map = dict() _play_threads_counter = 0 From f42a6f9d277bfce82ae87bdb27b1c030e731dbb3 Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Sun, 22 Feb 2026 19:04:56 +0330 Subject: [PATCH 3/6] fix : CLI functions moved to cli.py --- nava/__main__.py | 57 +---------------------------------------------- nava/cli.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 60 insertions(+), 57 deletions(-) create mode 100644 nava/cli.py diff --git a/nava/__main__.py b/nava/__main__.py index c3c021b..c305b84 100644 --- a/nava/__main__.py +++ b/nava/__main__.py @@ -1,62 +1,7 @@ # -*- coding: utf-8 -*- """Nava main.""" -import argparse -from art import tprint -from .params import NAVA_VERSION, EXIT_MESSAGE -from .functions import nava_help, play_cli -def parse_args() -> argparse.Namespace: - """Parse arguments.""" - parser = argparse.ArgumentParser() - parser.add_argument( - 'filename', - nargs='?', - type=str, - metavar='FILE_PATH', - help='path to audio file' - ) - parser.add_argument( - '--file', - nargs='?', - type=str, - metavar='FILE_PATH', - help='path to audio file', - ) - parser.add_argument('--loop', help='sound play in loop', action='store_true', default=False) - parser.add_argument('--version', help="version", action='store_true', default=False) - parser.add_argument('-v', help="version", action='store_true', default=False) - args = parser.parse_known_args()[0] - return args - - -def run(args: argparse.Namespace) -> None: - """ - Run nava CLI. - - :param args: arguments - """ - if args.version or args.v: - print(NAVA_VERSION) - elif args.filename or args.file: - file_name = args.filename - if args.file: - file_name = args.file - loop = args.loop - play_cli(file_name, loop=loop) - else: - tprint("Nava") - tprint("V:" + NAVA_VERSION) - nava_help() - - -def main() -> None: - """CLI main function.""" - try: - args = parse_args() - run(args) - except (KeyboardInterrupt, EOFError): - print(EXIT_MESSAGE) - +from .cli import main if __name__ == "__main__": main() diff --git a/nava/cli.py b/nava/cli.py new file mode 100644 index 0000000..3e71adb --- /dev/null +++ b/nava/cli.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +"""Nava cli.""" +import argparse +from art import tprint +from .params import NAVA_VERSION, EXIT_MESSAGE +from .functions import nava_help, play_cli + +def parse_args() -> argparse.Namespace: + """Parse arguments.""" + parser = argparse.ArgumentParser() + parser.add_argument( + 'filename', + nargs='?', + type=str, + metavar='FILE_PATH', + help='path to audio file' + ) + parser.add_argument( + '--file', + nargs='?', + type=str, + metavar='FILE_PATH', + help='path to audio file', + ) + parser.add_argument('--loop', help='sound play in loop', action='store_true', default=False) + parser.add_argument('--version', help="version", action='store_true', default=False) + parser.add_argument('-v', help="version", action='store_true', default=False) + args = parser.parse_known_args()[0] + return args + + +def run(args: argparse.Namespace) -> None: + """ + Run nava CLI. + + :param args: arguments + """ + if args.version or args.v: + print(NAVA_VERSION) + elif args.filename or args.file: + file_name = args.filename + if args.file: + file_name = args.file + loop = args.loop + play_cli(file_name, loop=loop) + else: + tprint("Nava") + tprint("V:" + NAVA_VERSION) + nava_help() + + +def main() -> None: + """CLI main function.""" + try: + args = parse_args() + run(args) + except (KeyboardInterrupt, EOFError): + print(EXIT_MESSAGE) diff --git a/setup.py b/setup.py index b3cdf66..08ddc8d 100644 --- a/setup.py +++ b/setup.py @@ -74,5 +74,5 @@ def read_description() -> str: license='MIT', entry_points={ 'console_scripts': [ - 'nava = nava.__main__:main', + 'nava = nava.cli:main', ]}) From d236a6916678639b4bd7ca975d1f9bd3b5cdab5f Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Sun, 22 Feb 2026 19:05:32 +0330 Subject: [PATCH 4/6] fix : autopep8 --- nava/cli.py | 1 + nava/functions.py | 6 +++--- nava/params.py | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/nava/cli.py b/nava/cli.py index 3e71adb..abfa1f0 100644 --- a/nava/cli.py +++ b/nava/cli.py @@ -5,6 +5,7 @@ from .params import NAVA_VERSION, EXIT_MESSAGE from .functions import nava_help, play_cli + def parse_args() -> argparse.Namespace: """Parse arguments.""" parser = argparse.ArgumentParser() diff --git a/nava/functions.py b/nava/functions.py index 78319eb..cf438be 100644 --- a/nava/functions.py +++ b/nava/functions.py @@ -52,7 +52,7 @@ def nava_help() -> None: def quote(func: Callable) -> Callable: """ Quote the given shell string. - + :param func: function to wrap """ @wraps(func) @@ -143,7 +143,7 @@ def get_sound_status(alias: str) -> str: # So the main thread can’t “see” the alias created in the worker thread. if getattr(current_thread, "_force_stop", False): break - status = get_sound_status (alias) + status = get_sound_status(alias) if status != "playing": if getattr(current_thread, "_loop", loop): stop_sound(alias) @@ -293,7 +293,7 @@ def __play_proc_afplay(sound_path: str) -> subprocess.Popen: def path_check(func: Callable) -> Callable: """ Check the given path to be a string and a valid file directory. - + :param func: function to wrap """ @wraps(func) diff --git a/nava/params.py b/nava/params.py index 48de32b..ffecbba 100644 --- a/nava/params.py +++ b/nava/params.py @@ -38,15 +38,15 @@ class PythonEnvironment(Enum): # Environment variables typically set by VS Code VSCODE_ENV_VARS = [ - "VSCODE_PID", # this is often set when running in VS Code - "VSCODE_CWD", # this is often set when running in VS Code + "VSCODE_PID", # this is often set when running in VS Code + "VSCODE_CWD", # this is often set when running in VS Code "VSCODE_IPC_HOOK_CLI", "TERM_PROGRAM", # often set to "vscode" ] # Shell type identifiers SHELL_TYPE_ZMQ = "zmqinteractiveshell" # Jupyter Notebook/Lab -SHELL_TYPE_TERMINAL = "terminalinteractiveshell" # IPython Terminal +SHELL_TYPE_TERMINAL = "terminalinteractiveshell" # IPython Terminal SOUND_FILE_PLAY_ERROR = "Sound can not play due to some issues." SOUND_FILE_EXIST_ERROR = "Given sound file doesn't exist." From 3d6d181c53eb41fcf699ba9dabc455382331d418 Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Sun, 22 Feb 2026 19:06:32 +0330 Subject: [PATCH 5/6] doc : CHANGELOG.md updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f7ee5..66d7f63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Changed - Python typing features added to all modules +- CLI functions moved to `cli.py` ## [0.8] - 2025-12-17 ### Added - `WinMM` engine From 3e6d3e596a5570f149beb390e0a05e18df5425fb Mon Sep 17 00:00:00 2001 From: sepandhaghighi Date: Mon, 23 Feb 2026 02:15:10 +0330 Subject: [PATCH 6/6] fix : sys.exit(1) added --- nava/cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nava/cli.py b/nava/cli.py index abfa1f0..b522c3a 100644 --- a/nava/cli.py +++ b/nava/cli.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- """Nava cli.""" +import sys import argparse from art import tprint from .params import NAVA_VERSION, EXIT_MESSAGE @@ -57,3 +58,4 @@ def main() -> None: run(args) except (KeyboardInterrupt, EOFError): print(EXIT_MESSAGE) + sys.exit(1)