docs: Remove empty testoutput blocks

These were once needed (I think) to get the tests to run at all, even
though they triggered warnings from sphinx. Now it works without them.
This commit is contained in:
Ben Darnell 2024-06-11 22:21:20 -04:00
parent 149f941af6
commit 9844c6751e
13 changed files with 2 additions and 103 deletions

View File

@ -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*.

View File

@ -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
^^^^^^^

View File

@ -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

View File

@ -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 <http://en.wikipedia.org/wiki/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 <http://www.python.org/dev/peps/pep-0318/>`_
`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

View File

@ -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
<https://github.com/tornadoweb/tornado/tree/stable/demos/chat>`_, which

View File

@ -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.

View File

@ -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".

View File

@ -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.

View File

@ -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`

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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 =