#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
|
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(add)
|
||||||
serv.register_function(lambda x, y: x-y)
|
serv.register_function(lambda x, y: x-y)
|
||||||
|
serv.register_function(annotation)
|
||||||
|
serv.register_instance(ClassWithAnnotation())
|
||||||
|
|
||||||
while numrequests > 0:
|
while numrequests > 0:
|
||||||
serv.handle_request()
|
serv.handle_request()
|
||||||
|
@ -177,10 +187,7 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
|
||||||
b'method takes two integers as arguments'
|
b'method takes two integers as arguments'
|
||||||
b'<br>\nand returns a double result.<br>\n '
|
b'<br>\nand returns a double result.<br>\n '
|
||||||
b'<br>\nThis server does NOT support system'
|
b'<br>\nThis server does NOT support system'
|
||||||
b'.methodSignature.</tt></dd></dl>\n<dl><dt><a name="-test_method">'
|
b'.methodSignature.</tt></dd></dl>'), response)
|
||||||
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)
|
|
||||||
|
|
||||||
def test_autolink_dotted_methods(self):
|
def test_autolink_dotted_methods(self):
|
||||||
"""Test that selfdot values are made strong automatically in the
|
"""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.""",
|
self.assertIn(b"""Try self.<strong>add</strong>, too.""",
|
||||||
response.read())
|
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():
|
def test_main():
|
||||||
support.run_unittest(DocXMLRPCHTTPGETServer)
|
support.run_unittest(DocXMLRPCHTTPGETServer)
|
||||||
|
|
||||||
|
|
|
@ -756,20 +756,23 @@ class ServerHTMLDoc(pydoc.HTMLDoc):
|
||||||
self.escape(anchor), self.escape(name))
|
self.escape(anchor), self.escape(name))
|
||||||
|
|
||||||
if inspect.ismethod(object):
|
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
|
# exclude the argument bound to the instance, it will be
|
||||||
# confusing to the non-Python user
|
# confusing to the non-Python user
|
||||||
argspec = inspect.formatargspec (
|
argspec = inspect.formatargspec (
|
||||||
args[1:],
|
args.args[1:],
|
||||||
varargs,
|
args.varargs,
|
||||||
varkw,
|
args.varkw,
|
||||||
defaults,
|
args.defaults,
|
||||||
|
annotations=args.annotations,
|
||||||
formatvalue=self.formatvalue
|
formatvalue=self.formatvalue
|
||||||
)
|
)
|
||||||
elif inspect.isfunction(object):
|
elif inspect.isfunction(object):
|
||||||
args, varargs, varkw, defaults = inspect.getargspec(object)
|
args = inspect.getfullargspec(object)
|
||||||
argspec = inspect.formatargspec(
|
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:
|
else:
|
||||||
argspec = '(...)'
|
argspec = '(...)'
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,9 @@ Core and Builtins
|
||||||
Library
|
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 #17998: Fix an internal error in regular expression engine.
|
||||||
|
|
||||||
- Issue #17557: Fix os.getgroups() to work with the modified behavior of
|
- Issue #17557: Fix os.getgroups() to work with the modified behavior of
|
||||||
|
|
Loading…
Reference in New Issue