mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Upgrade cmd module from CPython v3.14.2 (#6853)
Upgrades the `cmd` module and its tests from CPython v3.14.2 tag.
This commit is contained in:
37
Lib/cmd.py
vendored
37
Lib/cmd.py
vendored
@@ -5,16 +5,16 @@ Interpreters constructed with this class obey the following conventions:
|
||||
1. End of file on input is processed as the command 'EOF'.
|
||||
2. A command is parsed out of each line by collecting the prefix composed
|
||||
of characters in the identchars member.
|
||||
3. A command `foo' is dispatched to a method 'do_foo()'; the do_ method
|
||||
3. A command 'foo' is dispatched to a method 'do_foo()'; the do_ method
|
||||
is passed a single argument consisting of the remainder of the line.
|
||||
4. Typing an empty line repeats the last command. (Actually, it calls the
|
||||
method `emptyline', which may be overridden in a subclass.)
|
||||
5. There is a predefined `help' method. Given an argument `topic', it
|
||||
calls the command `help_topic'. With no arguments, it lists all topics
|
||||
method 'emptyline', which may be overridden in a subclass.)
|
||||
5. There is a predefined 'help' method. Given an argument 'topic', it
|
||||
calls the command 'help_topic'. With no arguments, it lists all topics
|
||||
with defined help_ functions, broken into up to three topics; documented
|
||||
commands, miscellaneous help topics, and undocumented commands.
|
||||
6. The command '?' is a synonym for `help'. The command '!' is a synonym
|
||||
for `shell', if a do_shell method exists.
|
||||
6. The command '?' is a synonym for 'help'. The command '!' is a synonym
|
||||
for 'shell', if a do_shell method exists.
|
||||
7. If completion is enabled, completing commands will be done automatically,
|
||||
and completing of commands args is done by calling complete_foo() with
|
||||
arguments text, line, begidx, endidx. text is string we are matching
|
||||
@@ -23,31 +23,34 @@ Interpreters constructed with this class obey the following conventions:
|
||||
indexes of the text being matched, which could be used to provide
|
||||
different completion depending upon which position the argument is in.
|
||||
|
||||
The `default' method may be overridden to intercept commands for which there
|
||||
The 'default' method may be overridden to intercept commands for which there
|
||||
is no do_ method.
|
||||
|
||||
The `completedefault' method may be overridden to intercept completions for
|
||||
The 'completedefault' method may be overridden to intercept completions for
|
||||
commands that have no complete_ method.
|
||||
|
||||
The data member `self.ruler' sets the character used to draw separator lines
|
||||
The data member 'self.ruler' sets the character used to draw separator lines
|
||||
in the help messages. If empty, no ruler line is drawn. It defaults to "=".
|
||||
|
||||
If the value of `self.intro' is nonempty when the cmdloop method is called,
|
||||
If the value of 'self.intro' is nonempty when the cmdloop method is called,
|
||||
it is printed out on interpreter startup. This value may be overridden
|
||||
via an optional argument to the cmdloop() method.
|
||||
|
||||
The data members `self.doc_header', `self.misc_header', and
|
||||
`self.undoc_header' set the headers used for the help function's
|
||||
The data members 'self.doc_header', 'self.misc_header', and
|
||||
'self.undoc_header' set the headers used for the help function's
|
||||
listings of documented functions, miscellaneous topics, and undocumented
|
||||
functions respectively.
|
||||
"""
|
||||
|
||||
import inspect, string, sys
|
||||
import sys
|
||||
|
||||
__all__ = ["Cmd"]
|
||||
|
||||
PROMPT = '(Cmd) '
|
||||
IDENTCHARS = string.ascii_letters + string.digits + '_'
|
||||
IDENTCHARS = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
'abcdefghijklmnopqrstuvwxyz'
|
||||
'0123456789'
|
||||
'_')
|
||||
|
||||
class Cmd:
|
||||
"""A simple framework for writing line-oriented command interpreters.
|
||||
@@ -270,7 +273,7 @@ class Cmd:
|
||||
endidx = readline.get_endidx() - stripped
|
||||
if begidx>0:
|
||||
cmd, args, foo = self.parseline(line)
|
||||
if cmd == '':
|
||||
if not cmd:
|
||||
compfunc = self.completedefault
|
||||
else:
|
||||
try:
|
||||
@@ -303,9 +306,11 @@ class Cmd:
|
||||
try:
|
||||
func = getattr(self, 'help_' + arg)
|
||||
except AttributeError:
|
||||
from inspect import cleandoc
|
||||
|
||||
try:
|
||||
doc=getattr(self, 'do_' + arg).__doc__
|
||||
doc = inspect.cleandoc(doc)
|
||||
doc = cleandoc(doc)
|
||||
if doc:
|
||||
self.stdout.write("%s\n"%str(doc))
|
||||
return
|
||||
|
||||
32
Lib/test/test_cmd.py
vendored
32
Lib/test/test_cmd.py
vendored
@@ -11,9 +11,15 @@ import unittest
|
||||
import io
|
||||
import textwrap
|
||||
from test import support
|
||||
from test.support.import_helper import import_module
|
||||
from test.support.import_helper import ensure_lazy_imports, import_module
|
||||
from test.support.pty_helper import run_pty
|
||||
|
||||
class LazyImportTest(unittest.TestCase):
|
||||
@support.cpython_only
|
||||
def test_lazy_import(self):
|
||||
ensure_lazy_imports("cmd", {"inspect", "string"})
|
||||
|
||||
|
||||
class samplecmdclass(cmd.Cmd):
|
||||
"""
|
||||
Instance the sampleclass:
|
||||
@@ -289,6 +295,30 @@ class CmdTestReadline(unittest.TestCase):
|
||||
self.assertIn(b'ab_completion_test', output)
|
||||
self.assertIn(b'tab completion success', output)
|
||||
|
||||
def test_bang_completion_without_do_shell(self):
|
||||
script = textwrap.dedent("""
|
||||
import cmd
|
||||
class simplecmd(cmd.Cmd):
|
||||
def completedefault(self, text, line, begidx, endidx):
|
||||
return ["hello"]
|
||||
|
||||
def default(self, line):
|
||||
if line.replace(" ", "") == "!hello":
|
||||
print('tab completion success')
|
||||
else:
|
||||
print('tab completion failure')
|
||||
return True
|
||||
|
||||
simplecmd().cmdloop()
|
||||
""")
|
||||
|
||||
# '! h' or '!h' and complete 'ello' to 'hello'
|
||||
for input in [b"! h\t\n", b"!h\t\n"]:
|
||||
with self.subTest(input=input):
|
||||
output = run_pty(script, input)
|
||||
self.assertIn(b'hello', output)
|
||||
self.assertIn(b'tab completion success', output)
|
||||
|
||||
def load_tests(loader, tests, pattern):
|
||||
tests.addTest(doctest.DocTestSuite())
|
||||
return tests
|
||||
|
||||
Reference in New Issue
Block a user