#8112: Update the documenting xmlrpc server to use getfullargspec.
Before this patch it would raise an error when trying to display documentation for a method that used annotations. Patch by Claudiu Popa.
This commit is contained in:
parent
319163244a
commit
f22b62e261
|
@ -54,8 +54,18 @@ def server(evt, numrequests):
|
|||
"""
|
||||
return x + y
|
||||
|
||||
def annotation(x: int):
|
||||
""" Use function annotations. """
|
||||
return x
|
||||
|
||||
class ClassWithAnnotation:
|
||||
def method_annotation(self, x: bytes):
|
||||
return x.decode()
|
||||
|
||||
serv.register_function(add)
|
||||
serv.register_function(lambda x, y: x-y)
|
||||
serv.register_function(annotation)
|
||||
serv.register_instance(ClassWithAnnotation())
|
||||
|
||||
while numrequests > 0:
|
||||
serv.handle_request()
|
||||
|
@ -177,10 +187,7 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
|
|||
b'method takes two integers as arguments'
|
||||
b'<br>\nand returns a double result.<br>\n '
|
||||
b'<br>\nThis server does NOT support system'
|
||||
b'.methodSignature.</tt></dd></dl>\n<dl><dt><a name="-test_method">'
|
||||
b'<strong>test_method</strong></a>(arg)</dt><dd><tt>Test '
|
||||
b'method\'s docs. This method truly does'
|
||||
b' very little.</tt></dd></dl>'), response)
|
||||
b'.methodSignature.</tt></dd></dl>'), response)
|
||||
|
||||
def test_autolink_dotted_methods(self):
|
||||
"""Test that selfdot values are made strong automatically in the
|
||||
|
@ -191,6 +198,18 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
|
|||
self.assertIn(b"""Try self.<strong>add</strong>, too.""",
|
||||
response.read())
|
||||
|
||||
def test_annotations(self):
|
||||
""" Test that annotations works as expected """
|
||||
self.client.request("GET", "/")
|
||||
response = self.client.getresponse()
|
||||
self.assertIn(
|
||||
(b'<dl><dt><a name="-annotation"><strong>annotation</strong></a>'
|
||||
b'(x: int)</dt><dd><tt>Use function annotations.</tt>'
|
||||
b'</dd></dl>\n<dl><dt><a name="-method_annotation"><strong>'
|
||||
b'method_annotation</strong></a>(x: bytes)</dt></dl>'),
|
||||
response.read())
|
||||
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(DocXMLRPCHTTPGETServer)
|
||||
|
||||
|
|
|
@ -756,20 +756,23 @@ class ServerHTMLDoc(pydoc.HTMLDoc):
|
|||
self.escape(anchor), self.escape(name))
|
||||
|
||||
if inspect.ismethod(object):
|
||||
args, varargs, varkw, defaults = inspect.getargspec(object)
|
||||
args = inspect.getfullargspec(object)
|
||||
# exclude the argument bound to the instance, it will be
|
||||
# confusing to the non-Python user
|
||||
argspec = inspect.formatargspec (
|
||||
args[1:],
|
||||
varargs,
|
||||
varkw,
|
||||
defaults,
|
||||
args.args[1:],
|
||||
args.varargs,
|
||||
args.varkw,
|
||||
args.defaults,
|
||||
annotations=args.annotations,
|
||||
formatvalue=self.formatvalue
|
||||
)
|
||||
elif inspect.isfunction(object):
|
||||
args, varargs, varkw, defaults = inspect.getargspec(object)
|
||||
args = inspect.getfullargspec(object)
|
||||
argspec = inspect.formatargspec(
|
||||
args, varargs, varkw, defaults, formatvalue=self.formatvalue)
|
||||
args.args, args.varargs, args.varkw, args.defaults,
|
||||
annotations=args.annotations,
|
||||
formatvalue=self.formatvalue)
|
||||
else:
|
||||
argspec = '(...)'
|
||||
|
||||
|
|
|
@ -64,6 +64,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
|
||||
if methods have annotations; it now correctly displays the annotations.
|
||||
|
||||
- Issue #17998: Fix an internal error in regular expression engine.
|
||||
|
||||
- Issue #17557: Fix os.getgroups() to work with the modified behavior of
|
||||
|
|
Loading…
Reference in New Issue