diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py index d6ca45847ec..7086d9a6a12 100644 --- a/Lib/test/test_docxmlrpc.py +++ b/Lib/test/test_docxmlrpc.py @@ -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'
\nand returns a double result.
\n ' b'
\nThis server does NOT support system' - b'.methodSignature.\n
' - b'test_method(arg)
Test ' - b'method\'s docs. This method truly does' - b' very little.
'), response) + b'.methodSignature.'), 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.add, too.""", response.read()) + def test_annotations(self): + """ Test that annotations works as expected """ + self.client.request("GET", "/") + response = self.client.getresponse() + self.assertIn( + (b'
annotation' + b'(x: int)
Use function annotations.' + b'
\n
' + b'method_annotation(x: bytes)
'), + response.read()) + + def test_main(): support.run_unittest(DocXMLRPCHTTPGETServer) diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 54e172670b1..78ca4e0a4af 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -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 = '(...)' diff --git a/Misc/NEWS b/Misc/NEWS index f2135c8a20a..d504066a6db 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -24,6 +24,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 #18600: Added policy argument to email.message.Message.as_string, and as_bytes and __bytes__ methods to Message.