diff --git a/docs/guide/async.rst b/docs/guide/async.rst index 1b5526ff..5e545df7 100644 --- a/docs/guide/async.rst +++ b/docs/guide/async.rst @@ -73,9 +73,6 @@ Here is a sample synchronous function: response = http_client.fetch(url) return response.body -.. testoutput:: - :hide: - And here is the same function rewritten asynchronously as a native coroutine: .. testcode:: @@ -87,9 +84,6 @@ And here is the same function rewritten asynchronously as a native coroutine: response = await http_client.fetch(url) return response.body -.. testoutput:: - :hide: - Or for compatibility with older versions of Python, using the `tornado.gen` module: .. testcode:: @@ -118,9 +112,6 @@ Coroutines are a little magical, but what they do internally is something like t fetch_future.add_done_callback(on_fetch) return my_future -.. testoutput:: - :hide: - Notice that the coroutine returns its `.Future` before the fetch is done. This is what makes coroutines *asynchronous*. diff --git a/docs/guide/coroutines.rst b/docs/guide/coroutines.rst index 811c084f..691fa305 100644 --- a/docs/guide/coroutines.rst +++ b/docs/guide/coroutines.rst @@ -207,9 +207,6 @@ The `.multi` function accepts lists and dicts whose values are for url in urls}) # responses is a dict {url: HTTPResponse} -.. testoutput:: - :hide: - In decorated coroutines, it is possible to ``yield`` the list or dict directly:: @gen.coroutine @@ -238,9 +235,6 @@ immediately, so you can start another operation before waiting. fetch_future = convert_yielded(self.fetch_next_chunk()) await self.flush() -.. testoutput:: - :hide: - This is a little easier to do with decorated coroutines, because they start immediately when called: @@ -256,9 +250,6 @@ start immediately when called: fetch_future = self.fetch_next_chunk() yield self.flush() -.. testoutput:: - :hide: - Looping ^^^^^^^ diff --git a/docs/guide/running.rst b/docs/guide/running.rst index 99d18275..8c7fda81 100644 --- a/docs/guide/running.rst +++ b/docs/guide/running.rst @@ -18,9 +18,6 @@ configuring a WSGI container to find your application, you write a if __name__ == '__main__': asyncio.run(main()) -.. testoutput:: - :hide: - Configure your operating system or process manager to run this program to start the server. Please note that it may be necessary to increase the number of open files per process (to avoid "Too many open files"-Error). @@ -53,9 +50,6 @@ alterations to application startup. await asyncio.Event().wait() asyncio.run(post_fork_main()) -.. testoutput:: - :hide: - This is another way to start multiple processes and have them all share the same port, although it has some limitations. First, each child process will have its own ``IOLoop``, so it is important that diff --git a/docs/guide/security.rst b/docs/guide/security.rst index ee33141e..859ed679 100644 --- a/docs/guide/security.rst +++ b/docs/guide/security.rst @@ -21,9 +21,6 @@ method: else: self.write("Your cookie was set!") -.. testoutput:: - :hide: - Cookies are not secure and can easily be modified by clients. If you need to set cookies to, e.g., identify the currently logged in user, you need to sign your cookies to prevent forgery. Tornado supports @@ -39,9 +36,6 @@ keyword arguments to your application: (r"/", MainHandler), ], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__") -.. testoutput:: - :hide: - Signed cookies contain the encoded value of the cookie in addition to a timestamp and an `HMAC `_ signature. If the cookie is old or if the signature doesn't match, @@ -58,9 +52,6 @@ set. The secure version of the example above: else: self.write("Your cookie was set!") -.. testoutput:: - :hide: - Tornado's signed cookies guarantee integrity but not confidentiality. That is, the cookie cannot be modified but its contents can be seen by the user. The ``cookie_secret`` is a symmetric key and must be kept secret -- @@ -129,9 +120,6 @@ specifying a nickname, which is then saved in a cookie: (r"/login", LoginHandler), ], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__") -.. testoutput:: - :hide: - You can require that the user be logged in using the `Python decorator `_ `tornado.web.authenticated`. If a request goes to a method with this @@ -156,9 +144,6 @@ rewritten: (r"/login", LoginHandler), ], **settings) -.. testoutput:: - :hide: - If you decorate ``post()`` methods with the ``authenticated`` decorator, and the user is not logged in, the server will send a ``403`` response. The ``@authenticated`` decorator is simply @@ -202,9 +187,6 @@ the Google credentials in a cookie for later access: response_type='code', extra_params={'approval_prompt': 'auto'}) -.. testoutput:: - :hide: - See the `tornado.auth` module documentation for more details. .. _xsrf: @@ -237,9 +219,6 @@ include the application setting ``xsrf_cookies``: (r"/login", LoginHandler), ], **settings) -.. testoutput:: - :hide: - If ``xsrf_cookies`` is set, the Tornado web application will set the ``_xsrf`` cookie for all users and reject all ``POST``, ``PUT``, and ``DELETE`` requests that do not contain a correct ``_xsrf`` value. If diff --git a/docs/guide/structure.rst b/docs/guide/structure.rst index d120ea40..100ad6bb 100644 --- a/docs/guide/structure.rst +++ b/docs/guide/structure.rst @@ -37,9 +37,6 @@ A minimal "hello world" example looks something like this: if __name__ == "__main__": asyncio.run(main()) -.. testoutput:: - :hide: - The ``main`` coroutine ~~~~~~~~~~~~~~~~~~~~~~ @@ -153,9 +150,6 @@ and `~.RequestHandler.get_body_argument`. self.set_header("Content-Type", "text/plain") self.write("You wrote " + self.get_body_argument("message")) -.. testoutput:: - :hide: - Since the HTML form encoding is ambiguous as to whether an argument is a single value or a list with one element, `.RequestHandler` has distinct methods to allow the application to indicate whether or not @@ -332,9 +326,6 @@ For example, here is a simple handler using a coroutine: self.write("Fetched " + str(len(json["entries"])) + " entries " "from the FriendFeed API") -.. testoutput:: - :hide: - For a more advanced asynchronous example, take a look at the `chat example application `_, which diff --git a/docs/guide/templates.rst b/docs/guide/templates.rst index 7c5a8f41..db2ef453 100644 --- a/docs/guide/templates.rst +++ b/docs/guide/templates.rst @@ -62,9 +62,6 @@ directory as your Python file, you could render this template with: items = ["Item 1", "Item 2", "Item 3"] self.render("template.html", title="My title", items=items) -.. testoutput:: - :hide: - Tornado templates support *control statements* and *expressions*. Control statements are surrounded by ``{%`` and ``%}``, e.g. ``{% if len(items) > 2 %}``. Expressions are surrounded by ``{{`` and @@ -202,9 +199,6 @@ by overriding `.RequestHandler.get_user_locale`: return None return self.current_user.prefs["locale"] -.. testoutput:: - :hide: - If ``get_user_locale`` returns ``None``, we fall back on the ``Accept-Language`` header. diff --git a/tornado/auth.py b/tornado/auth.py index d1edcc65..2f115f57 100644 --- a/tornado/auth.py +++ b/tornado/auth.py @@ -67,9 +67,6 @@ Example usage for Google OAuth: response_type='code', extra_params={'approval_prompt': 'auto'}) -.. testoutput:: - :hide: - """ import base64 @@ -661,9 +658,6 @@ class OAuth2Mixin(object): return self.finish("Posted a message!") - .. testoutput:: - :hide: - .. versionadded:: 4.3 .. versionchanged::: 6.0 @@ -721,9 +715,6 @@ class TwitterMixin(OAuthMixin): else: await self.authorize_redirect() - .. testoutput:: - :hide: - The user object returned by `~OAuthMixin.get_authenticated_user` includes the attributes ``username``, ``name``, ``access_token``, and all of the custom Twitter user attributes described at @@ -805,9 +796,6 @@ class TwitterMixin(OAuthMixin): return self.finish("Posted a message!") - .. testoutput:: - :hide: - .. versionchanged:: 6.0 The ``callback`` argument was removed. Use the returned @@ -959,9 +947,6 @@ class GoogleOAuth2Mixin(OAuth2Mixin): response_type='code', extra_params={'approval_prompt': 'auto'}) - .. testoutput:: - :hide: - .. versionchanged:: 6.0 The ``callback`` argument was removed. Use the returned awaitable object instead. @@ -1034,9 +1019,6 @@ class FacebookGraphMixin(OAuth2Mixin): client_id=self.settings["facebook_api_key"], extra_params={"scope": "user_posts"}) - .. testoutput:: - :hide: - This method returns a dictionary which may contain the following fields: * ``access_token``, a string which may be passed to `facebook_request` @@ -1151,9 +1133,6 @@ class FacebookGraphMixin(OAuth2Mixin): return self.finish("Posted a message!") - .. testoutput:: - :hide: - The given path is relative to ``self._FACEBOOK_BASE_URL``, by default "https://graph.facebook.com". diff --git a/tornado/gen.py b/tornado/gen.py index 0e3c7a6f..7d874774 100644 --- a/tornado/gen.py +++ b/tornado/gen.py @@ -29,9 +29,6 @@ For example, here's a coroutine-based handler: do_something_with_response(response) self.render("template.html") -.. testoutput:: - :hide: - Asynchronous functions in Tornado return an ``Awaitable`` or `.Future`; yielding this object returns its result. @@ -51,9 +48,6 @@ of results will be returned when they are all finished: response3 = response_dict['response3'] response4 = response_dict['response4'] -.. testoutput:: - :hide: - If ``tornado.platform.twisted`` is imported, it is also possible to yield Twisted's ``Deferred`` objects. See the `convert_yielded` function to extend this mechanism. diff --git a/tornado/ioloop.py b/tornado/ioloop.py index 3fb1359a..5a880b0c 100644 --- a/tornado/ioloop.py +++ b/tornado/ioloop.py @@ -116,9 +116,6 @@ class IOLoop(Configurable): if __name__ == "__main__": asyncio.run(main()) - .. testoutput:: - :hide: - Most applications should not attempt to construct an `IOLoop` directly, and instead initialize the `asyncio` event loop and use `IOLoop.current()`. In some cases, such as in test frameworks when initializing an `IOLoop` diff --git a/tornado/iostream.py b/tornado/iostream.py index ee577593..e3956c4d 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -1090,9 +1090,6 @@ class IOStream(BaseIOStream): if __name__ == '__main__': asyncio.run(main()) - .. testoutput:: - :hide: - """ def __init__(self, socket: socket.socket, *args: Any, **kwargs: Any) -> None: diff --git a/tornado/web.py b/tornado/web.py index bc13c6f7..30cef30b 100644 --- a/tornado/web.py +++ b/tornado/web.py @@ -39,10 +39,6 @@ Here is a simple "Hello, world" example app: if __name__ == "__main__": asyncio.run(main()) -.. testoutput:: - :hide: - - See the :doc:`guide` for additional information. Thread-safety notes diff --git a/tornado/websocket.py b/tornado/websocket.py index 01273030..ad5db559 100644 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@ -160,9 +160,6 @@ class WebSocketHandler(tornado.web.RequestHandler): def on_close(self): print("WebSocket closed") - .. testoutput:: - :hide: - WebSockets are not standard HTTP connections. The "handshake" is HTTP, but after the handshake, the protocol is message-based. Consequently, most of the Tornado HTTP facilities diff --git a/tox.ini b/tox.ini index a92c1c4c..5c3f6c6b 100644 --- a/tox.ini +++ b/tox.ini @@ -103,9 +103,8 @@ commands = sphinx-build -q -E -n -W -b html . {envtmpdir}/html # Ensure that everything is either documented or ignored in conf.py sphinx-build -q -E -n -W -b coverage . {envtmpdir}/coverage - # Run the doctests. No -W for doctests because that disallows tests - # with empty output. - sphinx-build -q -E -n -b doctest . {envtmpdir}/doctest + # Run the doctests + sphinx-build -q -E -n -W -b doctest . {envtmpdir}/doctest [testenv:lint] commands =