cli refactoring & path resolve
Browse files- src/knowlang/cli/__init__.py +3 -4
- src/knowlang/cli/parser.py +33 -23
src/knowlang/cli/__init__.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
import asyncio
|
3 |
from typing import Optional, Sequence
|
4 |
|
5 |
-
from knowlang.cli.parser import
|
6 |
from knowlang.utils.fancy_log import FancyLogger
|
7 |
|
8 |
LOG = FancyLogger(__name__)
|
@@ -16,8 +16,7 @@ async def main(args: Optional[Sequence[str]] = None) -> int:
|
|
16 |
Returns:
|
17 |
Exit code (0 for success, non-zero for error)
|
18 |
"""
|
19 |
-
|
20 |
-
parsed_args = parser.parse_args(args)
|
21 |
|
22 |
# Setup logging
|
23 |
if parsed_args.verbose:
|
@@ -25,7 +24,7 @@ async def main(args: Optional[Sequence[str]] = None) -> int:
|
|
25 |
|
26 |
try:
|
27 |
# Execute command
|
28 |
-
await parsed_args.
|
29 |
return 0
|
30 |
except Exception as e:
|
31 |
LOG.error(f"Error: {str(e)}")
|
|
|
2 |
import asyncio
|
3 |
from typing import Optional, Sequence
|
4 |
|
5 |
+
from knowlang.cli.parser import parse_args
|
6 |
from knowlang.utils.fancy_log import FancyLogger
|
7 |
|
8 |
LOG = FancyLogger(__name__)
|
|
|
16 |
Returns:
|
17 |
Exit code (0 for success, non-zero for error)
|
18 |
"""
|
19 |
+
parsed_args = parse_args()
|
|
|
20 |
|
21 |
# Setup logging
|
22 |
if parsed_args.verbose:
|
|
|
24 |
|
25 |
try:
|
26 |
# Execute command
|
27 |
+
await parsed_args.command_func(parsed_args)
|
28 |
return 0
|
29 |
except Exception as e:
|
30 |
LOG.error(f"Error: {str(e)}")
|
src/knowlang/cli/parser.py
CHANGED
@@ -1,37 +1,48 @@
|
|
1 |
"""Argument parsing for KnowLang CLI."""
|
2 |
import argparse
|
3 |
from pathlib import Path
|
4 |
-
from typing import Union
|
5 |
|
6 |
from knowlang.cli.commands.chat import chat_command
|
7 |
-
from knowlang.cli.types import ChatCommandArgs, ParseCommandArgs, BaseCommandArgs
|
8 |
from knowlang.cli.commands.parse import parse_command
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
-
def _convert_to_args(
|
11 |
"""Convert parsed namespace to typed arguments."""
|
12 |
base_args = {
|
13 |
-
"verbose":
|
14 |
-
"config":
|
|
|
15 |
}
|
16 |
|
17 |
-
|
18 |
-
|
|
|
|
|
|
|
19 |
**base_args,
|
20 |
-
path=
|
21 |
-
output=
|
22 |
-
command="parse"
|
23 |
)
|
24 |
-
elif
|
25 |
-
|
26 |
**base_args,
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
server_name=parsed_args.server_name
|
32 |
)
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
35 |
|
36 |
def create_parser() -> argparse.ArgumentParser:
|
37 |
"""Create the main argument parser."""
|
@@ -79,7 +90,6 @@ def create_parser() -> argparse.ArgumentParser:
|
|
79 |
type=Path,
|
80 |
help="Path to codebase directory or repository URL"
|
81 |
)
|
82 |
-
parse_parser.set_defaults(func=parse_command)
|
83 |
|
84 |
# Chat command
|
85 |
chat_parser = subparsers.add_parser(
|
@@ -106,11 +116,11 @@ def create_parser() -> argparse.ArgumentParser:
|
|
106 |
type=str,
|
107 |
help="Server name to listen on (default: 0.0.0.0)"
|
108 |
)
|
109 |
-
chat_parser.set_defaults(func=chat_command)
|
110 |
|
111 |
return parser
|
112 |
|
113 |
-
def parse_args() -> Union[ParseCommandArgs, BaseCommandArgs]:
|
114 |
"""Parse command line arguments into typed objects."""
|
115 |
parser = create_parser()
|
116 |
-
|
|
|
|
1 |
"""Argument parsing for KnowLang CLI."""
|
2 |
import argparse
|
3 |
from pathlib import Path
|
4 |
+
from typing import Optional, Sequence, Union, Dict, Type, Callable
|
5 |
|
6 |
from knowlang.cli.commands.chat import chat_command
|
|
|
7 |
from knowlang.cli.commands.parse import parse_command
|
8 |
+
from knowlang.cli.types import ChatCommandArgs, ParseCommandArgs, BaseCommandArgs
|
9 |
+
|
10 |
+
# Define command configurations
|
11 |
+
COMMAND_CONFIGS: Dict[str, tuple[Type[BaseCommandArgs], Callable]] = {
|
12 |
+
"parse": (ParseCommandArgs, parse_command),
|
13 |
+
"chat": (ChatCommandArgs, chat_command),
|
14 |
+
}
|
15 |
|
16 |
+
def _convert_to_args(parsed_namespace: argparse.Namespace) -> Union[ParseCommandArgs, ChatCommandArgs]:
|
17 |
"""Convert parsed namespace to typed arguments."""
|
18 |
base_args = {
|
19 |
+
"verbose": parsed_namespace.verbose,
|
20 |
+
"config": parsed_namespace.config if hasattr(parsed_namespace, "config") else None,
|
21 |
+
"command": parsed_namespace.command
|
22 |
}
|
23 |
|
24 |
+
# Get the appropriate argument class and command function
|
25 |
+
args_class, command_func = COMMAND_CONFIGS[parsed_namespace.command]
|
26 |
+
|
27 |
+
if parsed_namespace.command == "parse":
|
28 |
+
args = args_class(
|
29 |
**base_args,
|
30 |
+
path=Path(parsed_namespace.path).resolve(),
|
31 |
+
output=parsed_namespace.output
|
|
|
32 |
)
|
33 |
+
elif parsed_namespace.command == "chat":
|
34 |
+
args = args_class(
|
35 |
**base_args,
|
36 |
+
port=parsed_namespace.port,
|
37 |
+
share=parsed_namespace.share,
|
38 |
+
server_port=parsed_namespace.server_port,
|
39 |
+
server_name=parsed_namespace.server_name
|
|
|
40 |
)
|
41 |
+
else:
|
42 |
+
raise ValueError(f"Unknown command: {parsed_namespace.command}")
|
43 |
+
|
44 |
+
args.command_func = command_func
|
45 |
+
return args
|
46 |
|
47 |
def create_parser() -> argparse.ArgumentParser:
|
48 |
"""Create the main argument parser."""
|
|
|
90 |
type=Path,
|
91 |
help="Path to codebase directory or repository URL"
|
92 |
)
|
|
|
93 |
|
94 |
# Chat command
|
95 |
chat_parser = subparsers.add_parser(
|
|
|
116 |
type=str,
|
117 |
help="Server name to listen on (default: 0.0.0.0)"
|
118 |
)
|
|
|
119 |
|
120 |
return parser
|
121 |
|
122 |
+
def parse_args(args: Optional[Sequence[str]] = None) -> Union[ParseCommandArgs, BaseCommandArgs]:
|
123 |
"""Parse command line arguments into typed objects."""
|
124 |
parser = create_parser()
|
125 |
+
parsed_namespace = parser.parse_args(args)
|
126 |
+
return _convert_to_args(parsed_namespace)
|