gabykim commited on
Commit
f6b1033
·
1 Parent(s): c5563d6

cli refactoring & path resolve

Browse files
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 create_parser
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
- parser = create_parser()
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.func(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(parsed_args: argparse.Namespace) -> Union[ParseCommandArgs, BaseCommandArgs]:
11
  """Convert parsed namespace to typed arguments."""
12
  base_args = {
13
- "verbose": parsed_args.verbose,
14
- "config": parsed_args.config if hasattr(parsed_args, "config") else None
 
15
  }
16
 
17
- if parsed_args.command == "parse":
18
- return ParseCommandArgs(
 
 
 
19
  **base_args,
20
- path=parsed_args.path,
21
- output=parsed_args.output,
22
- command="parse"
23
  )
24
- elif parsed_args.command == "chat":
25
- return ChatCommandArgs(
26
  **base_args,
27
- command="chat",
28
- port=parsed_args.port,
29
- share=parsed_args.share,
30
- server_port=parsed_args.server_port,
31
- server_name=parsed_args.server_name
32
  )
33
-
34
- return BaseCommandArgs(**base_args)
 
 
 
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
- return _convert_to_args(parser.parse_args())
 
 
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)