mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-28 04:46:25 +08:00
🐛 fix argument parser message (#1426)
This commit is contained in:
parent
6c27ec7357
commit
e8ffa63b78
@ -12,6 +12,7 @@ import re
|
|||||||
import shlex
|
import shlex
|
||||||
from argparse import Action
|
from argparse import Action
|
||||||
from argparse import ArgumentError
|
from argparse import ArgumentError
|
||||||
|
from contextvars import ContextVar
|
||||||
from itertools import chain, product
|
from itertools import chain, product
|
||||||
from argparse import Namespace as Namespace
|
from argparse import Namespace as Namespace
|
||||||
from argparse import ArgumentParser as ArgParser
|
from argparse import ArgumentParser as ArgParser
|
||||||
@ -73,6 +74,8 @@ TRIE_VALUE = NamedTuple(
|
|||||||
"TRIE_VALUE", [("command_start", str), ("command", Tuple[str, ...])]
|
"TRIE_VALUE", [("command_start", str), ("command", Tuple[str, ...])]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
parser_message: ContextVar[str] = ContextVar("parser_message")
|
||||||
|
|
||||||
|
|
||||||
class TrieRule:
|
class TrieRule:
|
||||||
prefix: CharTrie = CharTrie()
|
prefix: CharTrie = CharTrie()
|
||||||
@ -446,13 +449,15 @@ class ArgumentParser(ArgParser):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _print_message(self, message: str, file: Optional[IO[str]] = None):
|
def _print_message(self, message: str, file: Optional[IO[str]] = None):
|
||||||
if message:
|
if (msg := parser_message.get(None)) is not None:
|
||||||
setattr(self, "_message", getattr(self, "_message", "") + message)
|
parser_message.set(msg + message)
|
||||||
|
else:
|
||||||
|
super()._print_message(message, file)
|
||||||
|
|
||||||
def exit(self, status: int = 0, message: Optional[str] = None):
|
def exit(self, status: int = 0, message: Optional[str] = None):
|
||||||
if message:
|
if message:
|
||||||
self._print_message(message)
|
self._print_message(message)
|
||||||
raise ParserExit(status=status, message=getattr(self, "_message", None))
|
raise ParserExit(status=status, message=parser_message.get(None))
|
||||||
|
|
||||||
|
|
||||||
class ShellCommandRule:
|
class ShellCommandRule:
|
||||||
@ -499,6 +504,7 @@ class ShellCommandRule:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if self.parser:
|
if self.parser:
|
||||||
|
t = parser_message.set("")
|
||||||
try:
|
try:
|
||||||
args = self.parser.parse_args(state[SHELL_ARGV])
|
args = self.parser.parse_args(state[SHELL_ARGV])
|
||||||
state[SHELL_ARGS] = args
|
state[SHELL_ARGS] = args
|
||||||
@ -506,6 +512,8 @@ class ShellCommandRule:
|
|||||||
state[SHELL_ARGS] = ParserExit(status=2, message=str(e))
|
state[SHELL_ARGS] = ParserExit(status=2, message=str(e))
|
||||||
except ParserExit as e:
|
except ParserExit as e:
|
||||||
state[SHELL_ARGS] = e
|
state[SHELL_ARGS] = e
|
||||||
|
finally:
|
||||||
|
parser_message.reset(t)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -296,6 +296,7 @@ async def test_shell_command(app: App):
|
|||||||
assert state[SHELL_ARGV] == []
|
assert state[SHELL_ARGV] == []
|
||||||
assert isinstance(state[SHELL_ARGS], ParserExit)
|
assert isinstance(state[SHELL_ARGS], ParserExit)
|
||||||
assert state[SHELL_ARGS].status != 0
|
assert state[SHELL_ARGS].status != 0
|
||||||
|
assert state[SHELL_ARGS].message.startswith(parser.format_usage() + "test: error:")
|
||||||
|
|
||||||
test_message_parser = shell_command(CMD, parser=parser)
|
test_message_parser = shell_command(CMD, parser=parser)
|
||||||
dependent = list(test_message_parser.checkers)[0]
|
dependent = list(test_message_parser.checkers)[0]
|
||||||
|
Loading…
Reference in New Issue
Block a user