Issue #21240: Add an abstractmethod directive to mark abstract methods in the docs more explicitly

This commit is contained in:
Berker Peksag 2015-12-08 12:14:50 +02:00
parent 45be8d67be
commit 6e9d2e687b
4 changed files with 25 additions and 11 deletions

View File

@ -230,7 +230,7 @@ ABC hierarchy::
.. deprecated:: 3.3
Use :class:`MetaPathFinder` or :class:`PathEntryFinder` instead.
.. method:: find_module(fullname, path=None)
.. abstractmethod:: find_module(fullname, path=None)
An abstact method for finding a :term:`loader` for the specified
module. Originally specified in :pep:`302`, this method was meant
@ -453,7 +453,7 @@ ABC hierarchy::
:pep:`302` protocol for loading arbitrary resources from the storage
back-end.
.. method:: get_data(path)
.. abstractmethod:: get_data(path)
An abstract method to return the bytes for the data located at *path*.
Loaders that have a file-like storage back-end
@ -489,7 +489,7 @@ ABC hierarchy::
.. versionchanged:: 3.4
No longer abstract and a concrete implementation is provided.
.. method:: get_source(fullname)
.. abstractmethod:: get_source(fullname)
An abstract method to return the source of a module. It is returned as
a text string using :term:`universal newlines`, translating all
@ -546,7 +546,7 @@ ABC hierarchy::
when implemented, helps a module to be executed as a script. The ABC
represents an optional :pep:`302` protocol.
.. method:: get_filename(fullname)
.. abstractmethod:: get_filename(fullname)
An abstract method that is to return the value of :attr:`__file__` for
the specified module. If no path is available, :exc:`ImportError` is
@ -586,11 +586,11 @@ ABC hierarchy::
.. deprecated:: 3.4
Use :meth:`Loader.exec_module` instead.
.. method:: get_filename(fullname)
.. abstractmethod:: get_filename(fullname)
Returns :attr:`path`.
.. method:: get_data(path)
.. abstractmethod:: get_data(path)
Reads *path* as a binary file and returns the bytes from it.

View File

@ -35,7 +35,7 @@ The numeric tower
Abstract. Retrieves the imaginary component of this number.
.. method:: conjugate()
.. abstractmethod:: conjugate()
Abstract. Returns the complex conjugate. For example, ``(1+3j).conjugate()
== (1-3j)``.

View File

@ -99,7 +99,7 @@ constants below:
:class:`BaseSelector` and its concrete implementations support the
:term:`context manager` protocol.
.. method:: register(fileobj, events, data=None)
.. abstractmethod:: register(fileobj, events, data=None)
Register a file object for selection, monitoring it for I/O events.
@ -112,7 +112,7 @@ constants below:
:exc:`ValueError` in case of invalid event mask or file descriptor, or
:exc:`KeyError` if the file object is already registered.
.. method:: unregister(fileobj)
.. abstractmethod:: unregister(fileobj)
Unregister a file object from selection, removing it from monitoring. A
file object shall be unregistered prior to being closed.
@ -136,7 +136,7 @@ constants below:
:exc:`ValueError` in case of invalid event mask or file descriptor, or
:exc:`KeyError` if the file object is not registered.
.. method:: select(timeout=None)
.. abstractmethod:: select(timeout=None)
Wait until some registered file objects become ready, or the timeout
expires.
@ -179,7 +179,7 @@ constants below:
This returns the :class:`SelectorKey` instance associated to this file
object, or raises :exc:`KeyError` if the file object is not registered.
.. method:: get_map()
.. abstractmethod:: get_map()
Return a mapping of file objects to selector keys.

View File

@ -164,6 +164,19 @@ class PyCoroutineMethod(PyCoroutineMixin, PyClassmember):
return PyClassmember.run(self)
class PyAbstractMethod(PyClassmember):
def handle_signature(self, sig, signode):
ret = super(PyAbstractMethod, self).handle_signature(sig, signode)
signode.insert(0, addnodes.desc_annotation('abstractmethod ',
'abstractmethod '))
return ret
def run(self):
self.name = 'py:method'
return PyClassmember.run(self)
# Support for documenting version of removal in deprecations
class DeprecatedRemoved(Directive):
@ -368,5 +381,6 @@ def setup(app):
app.add_directive_to_domain('py', 'decoratormethod', PyDecoratorMethod)
app.add_directive_to_domain('py', 'coroutinefunction', PyCoroutineFunction)
app.add_directive_to_domain('py', 'coroutinemethod', PyCoroutineMethod)
app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod)
app.add_directive('miscnews', MiscNews)
return {'version': '1.0', 'parallel_read_safe': True}