Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-numpydoc for openSUSE:Factory
checked in at 2025-08-02 00:41:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-numpydoc (Old)
and /work/SRC/openSUSE:Factory/.python-numpydoc.new.1085 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-numpydoc"
Sat Aug 2 00:41:16 2025 rev:19 rq:1296857 version:1.9.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-numpydoc/python-numpydoc.changes
2025-02-27 16:40:38.355831039 +0100
+++
/work/SRC/openSUSE:Factory/.python-numpydoc.new.1085/python-numpydoc.changes
2025-08-02 00:41:21.605588128 +0200
@@ -1,0 +2,39 @@
+Thu Jul 31 18:06:59 UTC 2025 - Ben Greiner <[email protected]>
+
+- Need to mention:
+ * Drop numpydoc-pr523-py312deprecation.patch
+ * Drop mockapp.patch
+
+-------------------------------------------------------------------
+Thu Jul 31 15:43:39 UTC 2025 - Felix Stegmeier <[email protected]>
+
+- update to 1.9.0
+ * ignore some errors at module level (#593).
+ * Rework hook output to remove the table (#611).
+ * Switch to storing AST nodes on the stack for more accurate method
signature check and easy access to parent nodes (#623).
+ * MAINT: Changed class constructor init GL08 reporting (#592).
+ * BUG: Correct functionality of numpydoc SS05 (#613).
+ * Specity the types of numpydoc_xref_ignore option (#631).
+ * DOC: Do not use types for *args, **kwargs (#585).
+ * mention conda-forge in installation docs (#595).
+ * Fix typo in validation.rst (#605).
+ * Fix broken link in format.rst (#628).
+ * CI: use hashes for actions' versions in publishing job (#579).
+ * Bump the actions group with 2 updates (#581).
+ * Bump pypa/gh-action-pypi-publish from 1.10.0 to 1.10.2 in the actions
group (#582).
+ * [pre-commit.ci] pre-commit autoupdate (#583).
+ * MAINT: Add _exception_on_warning to MockApp (#586).
+ * Bump the actions group across 1 directory with 2 updates (#590).
+ * don't pass maxsplit as positional arg (#596).
+ * [pre-commit.ci] pre-commit autoupdate (#598).
+ * Add Python 3.13 support (#599).
+ * Update readthedocs config (#600).
+ * Bump the actions group with 2 updates (#603).
+ * Bump the actions group with 3 updates (#609).
+ * [pre-commit.ci] pre-commit autoupdate (#614).
+ * Bump actions/download-artifact from 4.2.1 to 4.3.0 in the actions group
(#620).
+ * Bump scientific-python/circleci-artifacts-redirector-action from 1.0.0 to
1.1.0 in the actions group (#627).
+ * Switch to dependency groups (#626).
+ * Fix pip setup command in github workflow (#629).
+
+-------------------------------------------------------------------
Old:
----
mockapp.patch
numpydoc-1.8.0.tar.gz
numpydoc-pr523-py312deprecation.patch
New:
----
numpydoc-1.9.0.tar.gz
----------(Old B)----------
Old: * Drop numpydoc-pr523-py312deprecation.patch
* Drop mockapp.patch
Old:- Need to mention:
* Drop numpydoc-pr523-py312deprecation.patch
* Drop mockapp.patch
----------(Old E)----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-numpydoc.spec ++++++
--- /var/tmp/diff_new_pack.TEcAWQ/_old 2025-08-02 00:41:22.253614437 +0200
+++ /var/tmp/diff_new_pack.TEcAWQ/_new 2025-08-02 00:41:22.257614600 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-numpydoc
-Version: 1.8.0
+Version: 1.9.0
Release: 0
Summary: Sphinx extension to support docstrings in Numpy format
License: BSD-3-Clause
@@ -27,22 +27,16 @@
Source:
https://files.pythonhosted.org/packages/source/n/numpydoc/numpydoc-%{version}.tar.gz
# https://docs.python.org/3/objects.inv (changes from time to time, accessed
2024-02-29)
Source1: python-objects.inv
-# PATCH-FIX-UPSTREAM numpydoc-pr523-py312deprecation.patch
gh#numpy/numpydoc#523
-Patch0: numpydoc-pr523-py312deprecation.patch
-# PATCH-FIX-UPSTREAM https://github.com/numpy/numpydoc/pull/586 MAINT: Add
_exception_on_warning to MockApp
-Patch1: mockapp.patch
BuildRequires: %{python_module Sphinx >= 5}
BuildRequires: %{python_module base >= 3.8}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools}
-BuildRequires: %{python_module tabulate >= 0.8.10}
BuildRequires: %{python_module wheel}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires(post): update-alternatives
Requires(postun): update-alternatives
Requires: python-Sphinx >= 5
-Requires: python-tabulate >= 0.8.10
BuildArch: noarch
# SECTION test requirements
BuildRequires: %{python_module pytest}
++++++ numpydoc-1.8.0.tar.gz -> numpydoc-1.9.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/MANIFEST.in
new/numpydoc-1.9.0/MANIFEST.in
--- old/numpydoc-1.8.0/MANIFEST.in 2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/MANIFEST.in 2025-06-24 14:22:17.000000000 +0200
@@ -2,7 +2,6 @@
include *.txt
include *.rst
recursive-include doc *
-recursive-include requirements *
recursive-include numpydoc *
# Exclude what we don't want to include
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/PKG-INFO new/numpydoc-1.9.0/PKG-INFO
--- old/numpydoc-1.8.0/PKG-INFO 2024-08-09 17:52:01.653280000 +0200
+++ new/numpydoc-1.9.0/PKG-INFO 2025-06-24 14:22:24.037762600 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: numpydoc
-Version: 1.8.0
+Version: 1.9.0
Summary: Sphinx extension to support docstrings in Numpy format
Author-email: Pauli Virtanen and others <[email protected]>
License: Copyright (C) 2008-2023 Stefan van der Walt <[email protected]>,
Pauli Virtanen <[email protected]>
@@ -42,26 +42,14 @@
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Documentation
Requires-Python: >=3.9
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
Requires-Dist: sphinx>=6
-Requires-Dist: tabulate>=0.8.10
Requires-Dist: tomli>=1.1.0; python_version < "3.11"
-Provides-Extra: developer
-Requires-Dist: pre-commit>=3.3; extra == "developer"
-Requires-Dist: tomli; python_version < "3.11" and extra == "developer"
-Provides-Extra: doc
-Requires-Dist: numpy>=1.22; extra == "doc"
-Requires-Dist: matplotlib>=3.5; extra == "doc"
-Requires-Dist: pydata-sphinx-theme>=0.13.3; extra == "doc"
-Requires-Dist: sphinx>=7; extra == "doc"
-Requires-Dist: intersphinx_registry; extra == "doc"
-Provides-Extra: test
-Requires-Dist: pytest; extra == "test"
-Requires-Dist: pytest-cov; extra == "test"
-Requires-Dist: matplotlib; extra == "test"
+Dynamic: license-file
=====================================
numpydoc -- Numpy's Sphinx extensions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/doc/format.rst
new/numpydoc-1.9.0/doc/format.rst
--- old/numpydoc-1.8.0/doc/format.rst 2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/doc/format.rst 2025-06-24 14:22:17.000000000 +0200
@@ -225,11 +225,11 @@
Input arrays, description of `x1`, `x2`.
When documenting variable length positional, or keyword arguments, leave the
-leading star(s) in front of the name::
+leading star(s) in front of the name and do not specify a type::
- *args : tuple
+ *args
Additional arguments should be passed as keyword arguments
- **kwargs : dict, optional
+ **kwargs
Extra arguments to `metric`: refer to each metric documentation for a
list of all possible arguments.
@@ -557,7 +557,9 @@
Use the same sections as outlined above (all except :ref:`Returns <returns>`
are applicable). The constructor (``__init__``) should also be documented
here, the :ref:`Parameters <params>` section of the docstring details the
-constructor's parameters.
+constructor's parameters. While repetition is unnecessary, a docstring for
+the class constructor (``__init__``) can, optionally, be added to provide
+detailed initialization documentation.
An **Attributes** section, located below the :ref:`Parameters <params>`
section, may be used to describe non-method attributes of the class::
@@ -767,9 +769,9 @@
enclosed within ````double backticks````.
A more extensive example of reST markup can be found in `this example
-document <http://docutils.sourceforge.net/docs/user/rst/demo.txt>`_;
+document <https://docutils.sourceforge.net/docs/user/rst/demo.rst>`_;
the `quick reference
-<http://docutils.sourceforge.net/docs/user/rst/quickref.html>`_ is
+<https://docutils.sourceforge.net/docs/user/rst/quickref.html>`_ is
useful while editing.
Line spacing and indentation are significant and should be carefully
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/doc/install.rst
new/numpydoc-1.9.0/doc/install.rst
--- old/numpydoc-1.8.0/doc/install.rst 2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/doc/install.rst 2025-06-24 14:22:17.000000000 +0200
@@ -9,6 +9,7 @@
* `numpydoc on PyPI <http://pypi.python.org/pypi/numpydoc>`_
* `numpydoc on GitHub <https://github.com/numpy/numpydoc/>`_
+* `numpydoc on conda-forge
<https://prefix.dev/channels/conda-forge/packages/numpydoc>`_
`'numpydoc'` should be added to the ``extensions`` option in your Sphinx
``conf.py``. ``'sphinx.ext.autosummary'`` will automatically be loaded
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/doc/release/notes.rst
new/numpydoc-1.9.0/doc/release/notes.rst
--- old/numpydoc-1.8.0/doc/release/notes.rst 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/doc/release/notes.rst 2025-06-24 14:22:17.000000000
+0200
@@ -1,3 +1,82 @@
+1.9.0
+=====
+
+We're happy to announce the release of numpydoc 1.9.0!
+
+Enhancements
+------------
+
+- ignore some errors at module level (`#593
<https://github.com/numpy/numpydoc/pull/593>`_).
+- Rework hook output to remove the table (`#611
<https://github.com/numpy/numpydoc/pull/611>`_).
+- Switch to storing AST nodes on the stack for more accurate method signature
check and easy access to parent nodes (`#623
<https://github.com/numpy/numpydoc/pull/623>`_).
+
+Bug Fixes
+---------
+
+- MAINT: Changed class constructor __init__ GL08 reporting (`#592
<https://github.com/numpy/numpydoc/pull/592>`_).
+- BUG: Correct functionality of numpydoc SS05 (`#613
<https://github.com/numpy/numpydoc/pull/613>`_).
+- Specity the types of ``numpydoc_xref_ignore`` option (`#631
<https://github.com/numpy/numpydoc/pull/631>`_).
+
+Documentation
+-------------
+
+- DOC: Do not use types for *args, **kwargs (`#585
<https://github.com/numpy/numpydoc/pull/585>`_).
+- mention conda-forge in installation docs (`#595
<https://github.com/numpy/numpydoc/pull/595>`_).
+- Fix typo in validation.rst (`#605
<https://github.com/numpy/numpydoc/pull/605>`_).
+- Fix broken link in ``format.rst`` (`#628
<https://github.com/numpy/numpydoc/pull/628>`_).
+
+Maintenance
+-----------
+
+- CI: use hashes for actions' versions in publishing job (`#579
<https://github.com/numpy/numpydoc/pull/579>`_).
+- Bump the actions group with 2 updates (`#581
<https://github.com/numpy/numpydoc/pull/581>`_).
+- Bump pypa/gh-action-pypi-publish from 1.10.0 to 1.10.2 in the actions group
(`#582 <https://github.com/numpy/numpydoc/pull/582>`_).
+- [pre-commit.ci] pre-commit autoupdate (`#583
<https://github.com/numpy/numpydoc/pull/583>`_).
+- MAINT: Add _exception_on_warning to MockApp (`#586
<https://github.com/numpy/numpydoc/pull/586>`_).
+- Bump the actions group across 1 directory with 2 updates (`#590
<https://github.com/numpy/numpydoc/pull/590>`_).
+- don't pass maxsplit as positional arg (`#596
<https://github.com/numpy/numpydoc/pull/596>`_).
+- [pre-commit.ci] pre-commit autoupdate (`#598
<https://github.com/numpy/numpydoc/pull/598>`_).
+- Add Python 3.13 support (`#599
<https://github.com/numpy/numpydoc/pull/599>`_).
+- Update readthedocs config (`#600
<https://github.com/numpy/numpydoc/pull/600>`_).
+- Bump the actions group with 2 updates (`#603
<https://github.com/numpy/numpydoc/pull/603>`_).
+- Bump the actions group with 3 updates (`#609
<https://github.com/numpy/numpydoc/pull/609>`_).
+- [pre-commit.ci] pre-commit autoupdate (`#614
<https://github.com/numpy/numpydoc/pull/614>`_).
+- Bump actions/download-artifact from 4.2.1 to 4.3.0 in the actions group
(`#620 <https://github.com/numpy/numpydoc/pull/620>`_).
+- Bump scientific-python/circleci-artifacts-redirector-action from 1.0.0 to
1.1.0 in the actions group (`#627
<https://github.com/numpy/numpydoc/pull/627>`_).
+- Switch to dependency groups (`#626
<https://github.com/numpy/numpydoc/pull/626>`_).
+- Fix pip setup command in github workflow (`#629
<https://github.com/numpy/numpydoc/pull/629>`_).
+
+Contributors
+------------
+
+13 authors added to this release (alphabetically):
+
+- Brigitta Sipőcz (`@bsipocz <https://github.com/bsipocz>`_)
+- Daniel McCloy (`@drammock <https://github.com/drammock>`_)
+- Eric Larson (`@larsoner <https://github.com/larsoner>`_)
+- Gilles Peiffer (`@Peiffap <https://github.com/Peiffap>`_)
+- Jarrod Millman (`@jarrodmillman <https://github.com/jarrodmillman>`_)
+- Lucas Colley (`@lucascolley <https://github.com/lucascolley>`_)
+- Matt Gebert (`@mattgebert <https://github.com/mattgebert>`_)
+- Maxine Hartnett (`@maxinelasp <https://github.com/maxinelasp>`_)
+- Ross Barnowski (`@rossbar <https://github.com/rossbar>`_)
+- Stefan van der Walt (`@stefanv <https://github.com/stefanv>`_)
+- Stefanie Molin (`@stefmolin <https://github.com/stefmolin>`_)
+- Tim Hoffmann (`@timhoffm <https://github.com/timhoffm>`_)
+- Yuki Kobayashi (`@koyuki7w <https://github.com/koyuki7w>`_)
+
+7 reviewers added to this release (alphabetically):
+
+- Charles Harris (`@charris <https://github.com/charris>`_)
+- Eric Larson (`@larsoner <https://github.com/larsoner>`_)
+- Jarrod Millman (`@jarrodmillman <https://github.com/jarrodmillman>`_)
+- Lucas Colley (`@lucascolley <https://github.com/lucascolley>`_)
+- Matt Gebert (`@mattgebert <https://github.com/mattgebert>`_)
+- Ross Barnowski (`@rossbar <https://github.com/rossbar>`_)
+- Stefan van der Walt (`@stefanv <https://github.com/stefanv>`_)
+
+_These lists are automatically generated, and may not be complete or may
contain duplicates._
+
1.8.0
=====
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/doc/validation.rst
new/numpydoc-1.9.0/doc/validation.rst
--- old/numpydoc-1.8.0/doc/validation.rst 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/doc/validation.rst 2025-06-24 14:22:17.000000000
+0200
@@ -183,6 +183,9 @@
def __init__(self): # numpydoc ignore=GL08
pass
+Note that a properly formatted :ref:`class <classdoc>` docstring
+silences ``GL08`` for an ``__init__`` constructor without a docstring.
+
This is supported by the :ref:`CLI <validation_via_cli>`,
:ref:`pre-commit hook <pre_commit_hook>`, and
:ref:`Sphinx extension <validation_during_sphinx_build>`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/__main__.py
new/numpydoc-1.9.0/numpydoc/__main__.py
--- old/numpydoc-1.8.0/numpydoc/__main__.py 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/numpydoc/__main__.py 2025-06-24 14:22:17.000000000
+0200
@@ -1,6 +1,6 @@
"""
-Implementing `python -m numpydoc` functionality.
-"""
+Implementing `python -m numpydoc` functionality
+""" # '.' omitted at end of docstring for testing purposes!
from .cli import main
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/_version.py
new/numpydoc-1.9.0/numpydoc/_version.py
--- old/numpydoc-1.8.0/numpydoc/_version.py 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/numpydoc/_version.py 2025-06-24 14:22:17.000000000
+0200
@@ -1 +1 @@
-__version__ = "1.8.0"
+__version__ = "1.9.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/cli.py
new/numpydoc-1.9.0/numpydoc/cli.py
--- old/numpydoc-1.8.0/numpydoc/cli.py 2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/cli.py 2025-06-24 14:22:17.000000000 +0200
@@ -104,10 +104,11 @@
nargs="*",
help=(
f"""Check codes to ignore.{
- ' Currently ignoring the following from '
- f'{Path(project_root_from_cwd) / config_file}:
{ignored_checks_text}'
- 'Values provided here will be in addition to the above, unless
an alternate config is provided.'
- if ignored_checks else ''
+ " Currently ignoring the following from "
+ f"{Path(project_root_from_cwd) / config_file}:
{ignored_checks_text}"
+ "Values provided here will be in addition to the above, unless
an alternate config is provided."
+ if ignored_checks
+ else ""
}"""
),
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/docscrape.py
new/numpydoc-1.9.0/numpydoc/docscrape.py
--- old/numpydoc-1.8.0/numpydoc/docscrape.py 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/numpydoc/docscrape.py 2025-06-24 14:22:17.000000000
+0200
@@ -232,8 +232,7 @@
# NOTE: param line with single element should never have a
# a " :" before the description line, so this should probably
# warn.
- if header.endswith(" :"):
- header = header[:-2]
+ header = header.removesuffix(" :")
if single_element_is_type:
arg_name, arg_type = "", header
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/docscrape_sphinx.py
new/numpydoc-1.9.0/numpydoc/docscrape_sphinx.py
--- old/numpydoc-1.8.0/numpydoc/docscrape_sphinx.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/docscrape_sphinx.py 2025-06-24
14:22:17.000000000 +0200
@@ -160,7 +160,7 @@
display_param = f":obj:`{param} <{link_prefix}{param}>`"
if obj_doc:
# Overwrite desc. Take summary logic of autosummary
- desc = re.split(r"\n\s*\n", obj_doc.strip(), 1)[0]
+ desc = re.split(r"\n\s*\n", obj_doc.strip(), maxsplit=1)[0]
# XXX: Should this have DOTALL?
# It does not in autosummary
m = re.search(r"^([A-Z].*?\.)(?:\s|$)", " ".join(desc.split()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/hooks/validate_docstrings.py
new/numpydoc-1.9.0/numpydoc/hooks/validate_docstrings.py
--- old/numpydoc-1.8.0/numpydoc/hooks/validate_docstrings.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/hooks/validate_docstrings.py 2025-06-24
14:22:17.000000000 +0200
@@ -14,8 +14,6 @@
from pathlib import Path
from typing import Any, Dict, List, Tuple, Union
-from tabulate import tabulate
-
from .. import docscrape, validate
from .utils import find_project_root
@@ -35,7 +33,12 @@
"""
def __init__(
- self, *, ast_node: ast.AST, filename: os.PathLike, obj_name: str
+ self,
+ *,
+ ast_node: ast.AST,
+ filename: os.PathLike,
+ obj_name: str,
+ ancestry: list[ast.AST],
) -> None:
self.node: ast.AST = ast_node
self.raw_doc: str = ast.get_docstring(self.node, clean=False) or ""
@@ -48,6 +51,8 @@
self.is_class: bool = isinstance(ast_node, ast.ClassDef)
self.is_module: bool = isinstance(ast_node, ast.Module)
+ self.ancestry: list[ast.AST] = ancestry
+
@staticmethod
def _load_obj(name):
raise NotImplementedError("AstValidator does not support this method.")
@@ -61,6 +66,10 @@
return isinstance(self.node, (ast.FunctionDef, ast.AsyncFunctionDef))
@property
+ def is_mod(self) -> bool:
+ return self.is_module
+
+ @property
def is_generator_function(self) -> bool:
if not self.is_function_or_method:
return False
@@ -89,7 +98,7 @@
@property
def signature_parameters(self) -> Tuple[str]:
- def extract_signature(node):
+ def extract_signature(node, parent):
args_node = node.args
params = []
for arg_type in ["posonlyargs", "args", "vararg", "kwonlyargs",
"kwarg"]:
@@ -102,17 +111,21 @@
else:
params.extend([arg.arg for arg in entries])
params = tuple(params)
- if params and params[0] in {"self", "cls"}:
+ if (
+ params
+ and params[0] in {"self", "cls"}
+ and isinstance(parent, ast.ClassDef)
+ ):
return params[1:]
return params
params = tuple()
if self.is_function_or_method:
- params = extract_signature(self.node)
+ params = extract_signature(self.node, self.ancestry[-1])
elif self.is_class:
for child in self.node.body:
if isinstance(child, ast.FunctionDef) and child.name ==
"__init__":
- params = extract_signature(child)
+ params = extract_signature(child, self.node)
return params
@property
@@ -142,9 +155,23 @@
self.config: dict = config
self.filepath: str = filepath
self.module_name: str = Path(self.filepath).stem
- self.stack: list[str] = []
+ self.stack: list[ast.AST] = []
self.findings: list = []
+ @property
+ def node_name(self) -> str:
+ """
+ Get the full name of the current node in the stack.
+
+ Returns
+ -------
+ str
+ The full name of the current node in the stack.
+ """
+ return ".".join(
+ [getattr(node, "name", self.module_name) for node in self.stack]
+ )
+
def _ignore_issue(self, node: ast.AST, check: str) -> bool:
"""
Check whether the issue should be ignored.
@@ -183,13 +210,17 @@
node : ast.AST
The node under inspection.
"""
- name = ".".join(self.stack)
+ name = self.node_name
report = validate.validate(
- name, AstValidator, ast_node=node, filename=self.filepath
+ name,
+ AstValidator,
+ ast_node=node,
+ filename=self.filepath,
+ ancestry=self.stack[:-1],
)
self.findings.extend(
[
- [f'{self.filepath}:{report["file_line"]}', name, check,
description]
+ [f"{self.filepath}:{report['file_line']}", name, check,
description]
for check, description in report["errors"]
if not self._ignore_issue(node, check)
]
@@ -207,13 +238,11 @@
if isinstance(
node, (ast.Module, ast.ClassDef, ast.FunctionDef,
ast.AsyncFunctionDef)
):
- self.stack.append(
- self.module_name if isinstance(node, ast.Module) else node.name
- )
+ self.stack.append(node)
if not (
self.config["exclude"]
- and re.search(self.config["exclude"], ".".join(self.stack))
+ and re.search(self.config["exclude"], self.node_name)
):
self._get_numpydoc_issues(node)
@@ -367,19 +396,12 @@
config_options = parse_config(config or project_root)
config_options["checks"] -= set(ignore or [])
- findings = []
+ findings = False
for file in files:
- findings.extend(process_file(file, config_options))
+ if file_issues := process_file(file, config_options):
+ findings = True
- if findings:
- print(
- tabulate(
- findings,
- headers=["file", "item", "check", "description"],
- tablefmt="grid",
- maxcolwidths=50,
- ),
- file=sys.stderr,
- )
- return 1
- return 0
+ for line, obj, check, description in file_issues:
+ print(f"\n{line}: {check} {description}", file=sys.stderr)
+
+ return int(findings)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/numpydoc.py
new/numpydoc-1.9.0/numpydoc/numpydoc.py
--- old/numpydoc-1.8.0/numpydoc/numpydoc.py 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/numpydoc/numpydoc.py 2025-06-24 14:22:17.000000000
+0200
@@ -296,7 +296,7 @@
app.add_config_value("numpydoc_attributes_as_param_list", True, True)
app.add_config_value("numpydoc_xref_param_type", False, True)
app.add_config_value("numpydoc_xref_aliases", dict(), True)
- app.add_config_value("numpydoc_xref_ignore", set(), True)
+ app.add_config_value("numpydoc_xref_ignore", set(), True, types=[set, str])
app.add_config_value("numpydoc_validation_checks", set(), True)
app.add_config_value("numpydoc_validation_exclude", set(), False)
app.add_config_value("numpydoc_validation_overrides", dict(), False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/numpydoc-1.8.0/numpydoc/tests/hooks/example_module.py
new/numpydoc-1.9.0/numpydoc/tests/hooks/example_module.py
--- old/numpydoc-1.8.0/numpydoc/tests/hooks/example_module.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/hooks/example_module.py 2025-06-24
14:22:17.000000000 +0200
@@ -23,8 +23,8 @@
*args
"""
- def process(self):
- """Process stuff."""
+ def create(self):
+ """Creates stuff."""
class NewClass:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/numpydoc-1.8.0/numpydoc/tests/hooks/test_validate_hook.py
new/numpydoc-1.9.0/numpydoc/tests/hooks/test_validate_hook.py
--- old/numpydoc-1.8.0/numpydoc/tests/hooks/test_validate_hook.py
2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/hooks/test_validate_hook.py
2025-06-24 14:22:17.000000000 +0200
@@ -8,7 +8,7 @@
from numpydoc.hooks.validate_docstrings import run_hook
[email protected]()
[email protected]
def example_module(request):
fullpath = (
Path(request.config.rootdir)
@@ -26,55 +26,47 @@
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | file | item
| check | description |
-
+===========================================+=====================================+=========+====================================================+
- | numpydoc/tests/hooks/example_module.py:1 | example_module
| EX01 | No examples section found |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | ES01 | No extended summary found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | SA01 | See Also section not found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | EX01 | No examples section found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:8 | example_module.MyClass
| ES01 | No extended summary found |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:8 | example_module.MyClass
| SA01 | See Also section not found |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:8 | example_module.MyClass
| EX01 | No examples section found |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:11 |
example_module.MyClass.__init__ | GL08 | The object does not have a
docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | ES01 | No extended summary found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR01 | Parameters {'**kwargs'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR07 | Parameter "*args" has no
description |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | SA01 | See Also section not found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | EX01 | No examples section found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:26 |
example_module.MyClass.process | SS05 | Summary must start with
infinitive verb, not third |
- | |
| | person (e.g. use "Generate" instead of |
- | |
| | "Generates") |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:26 |
example_module.MyClass.process | ES01 | No extended summary found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:26 |
example_module.MyClass.process | SA01 | See Also section not found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:26 |
example_module.MyClass.process | EX01 | No examples section found
|
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:30 | example_module.NewClass
| GL08 | The object does not have a docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: ES01 No extended summary
found
+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:4: SA01 See Also section not
found
+
+ numpydoc/tests/hooks/example_module.py:4: EX01 No examples section
found
+
+ numpydoc/tests/hooks/example_module.py:8: ES01 No extended summary
found
+
+ numpydoc/tests/hooks/example_module.py:8: SA01 See Also section not
found
+
+ numpydoc/tests/hooks/example_module.py:8: EX01 No examples section
found
+
+ numpydoc/tests/hooks/example_module.py:11: GL08 The object does not
have a docstring
+
+ numpydoc/tests/hooks/example_module.py:17: ES01 No extended summary
found
+
+ numpydoc/tests/hooks/example_module.py:17: PR01 Parameters
{'**kwargs'} not documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR07 Parameter "*args" has
no description
+
+ numpydoc/tests/hooks/example_module.py:17: SA01 See Also section not
found
+
+ numpydoc/tests/hooks/example_module.py:17: EX01 No examples section
found
+
+ numpydoc/tests/hooks/example_module.py:26: SS05 Summary must start
with infinitive verb, not third person (e.g. use "Generate" instead of
"Generates")
+
+ numpydoc/tests/hooks/example_module.py:26: ES01 No extended summary
found
+
+ numpydoc/tests/hooks/example_module.py:26: SA01 See Also section not
found
+
+ numpydoc/tests/hooks/example_module.py:26: EX01 No examples section
found
+
+ numpydoc/tests/hooks/example_module.py:30: GL08 The object does not
have a docstring
"""
)
return_code = run_hook([example_module], config=config)
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
def test_validate_hook_with_ignore(example_module, capsys):
@@ -85,30 +77,24 @@
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | file | item
| check | description |
-
+===========================================+=====================================+=========+====================================================+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:11 |
example_module.MyClass.__init__ | GL08 | The object does not have a
docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR01 | Parameters {'**kwargs'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR07 | Parameter "*args" has no
description |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:26 |
example_module.MyClass.process | SS05 | Summary must start with
infinitive verb, not third |
- | |
| | person (e.g. use "Generate" instead of |
- | |
| | "Generates") |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
- | numpydoc/tests/hooks/example_module.py:30 | example_module.NewClass
| GL08 | The object does not have a docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:11: GL08 The object does not
have a docstring
+
+ numpydoc/tests/hooks/example_module.py:17: PR01 Parameters
{'**kwargs'} not documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR07 Parameter "*args" has
no description
+
+ numpydoc/tests/hooks/example_module.py:26: SS05 Summary must start
with infinitive verb, not third person (e.g. use "Generate" instead of
"Generates")
+
+ numpydoc/tests/hooks/example_module.py:30: GL08 The object does not
have a docstring
"""
)
return_code = run_hook([example_module], ignore=["ES01", "SA01", "EX01"])
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
def test_validate_hook_with_toml_config(example_module, tmp_path, capsys):
@@ -130,9 +116,7 @@
]
exclude = '\\.__init__$'
override_SS05 = [
- '^Process',
- '^Assess',
- '^Access',
+ '^Creates',
]
"""
)
@@ -140,23 +124,19 @@
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | file | item
| check | description |
-
+===========================================+=====================================+=========+========================================+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR01 | Parameters {'**kwargs'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR07 | Parameter "*args" has no
description |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:30 | example_module.NewClass
| GL08 | The object does not have a docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR01 Parameters
{'**kwargs'} not documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR07 Parameter "*args" has
no description
+
+ numpydoc/tests/hooks/example_module.py:30: GL08 The object does not
have a docstring
"""
)
return_code = run_hook([example_module], config=tmp_path)
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
def test_validate_hook_with_setup_cfg(example_module, tmp_path, capsys):
@@ -172,30 +152,26 @@
[tool:numpydoc_validation]
checks = all,EX01,SA01,ES01
exclude = \\.__init__$
- override_SS05 = ^Process,^Assess,^Access
+ override_SS05 = ^Creates
"""
)
)
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | file | item
| check | description |
-
+===========================================+=====================================+=========+========================================+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR01 | Parameters {'**kwargs'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR07 | Parameter "*args" has no
description |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:30 | example_module.NewClass
| GL08 | The object does not have a docstring |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR01 Parameters
{'**kwargs'} not documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR07 Parameter "*args" has
no description
+
+ numpydoc/tests/hooks/example_module.py:30: GL08 The object does not
have a docstring
"""
)
return_code = run_hook([example_module], config=tmp_path)
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
def test_validate_hook_exclude_option_pyproject(example_module, tmp_path,
capsys):
@@ -220,9 +196,7 @@
'\.__init__$',
]
override_SS05 = [
- '^Process',
- '^Assess',
- '^Access',
+ '^Creates',
]
"""
)
@@ -230,19 +204,15 @@
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+------------------------------+---------+--------------------------------------+
- | file | item
| check | description |
-
+===========================================+==============================+=========+======================================+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not documented |
-
+-------------------------------------------+------------------------------+---------+--------------------------------------+
- | numpydoc/tests/hooks/example_module.py:30 | example_module.NewClass
| GL08 | The object does not have a docstring |
-
+-------------------------------------------+------------------------------+---------+--------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:30: GL08 The object does not
have a docstring
"""
)
return_code = run_hook([example_module], config=tmp_path)
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
def test_validate_hook_exclude_option_setup_cfg(example_module, tmp_path,
capsys):
@@ -258,25 +228,21 @@
[tool:numpydoc_validation]
checks = all,EX01,SA01,ES01
exclude = \\.NewClass$,\\.__init__$
- override_SS05 = ^Process,^Assess,^Access
+ override_SS05 = ^Creates
"""
)
)
expected = inspect.cleandoc(
"""
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | file | item
| check | description |
-
+===========================================+=====================================+=========+========================================+
- | numpydoc/tests/hooks/example_module.py:4 |
example_module.some_function | PR01 | Parameters {'name'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR01 | Parameters {'**kwargs'} not
documented |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
- | numpydoc/tests/hooks/example_module.py:17 |
example_module.MyClass.do_something | PR07 | Parameter "*args" has no
description |
-
+-------------------------------------------+-------------------------------------+---------+----------------------------------------+
+ numpydoc/tests/hooks/example_module.py:4: PR01 Parameters {'name'} not
documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR01 Parameters
{'**kwargs'} not documented
+
+ numpydoc/tests/hooks/example_module.py:17: PR07 Parameter "*args" has
no description
"""
)
return_code = run_hook([example_module], config=tmp_path)
assert return_code == 1
- assert capsys.readouterr().err.rstrip() == expected
+ assert capsys.readouterr().err.strip() == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/tests/test_docscrape.py
new/numpydoc-1.9.0/numpydoc/tests/test_docscrape.py
--- old/numpydoc-1.8.0/numpydoc/tests/test_docscrape.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/test_docscrape.py 2025-06-24
14:22:17.000000000 +0200
@@ -1596,8 +1596,8 @@
self.numpydoc_validation_overrides = dict()
xref_aliases_complete = deepcopy(DEFAULT_LINKS)
- for key in xref_aliases:
- xref_aliases_complete[key] = xref_aliases[key]
+ for key, val in xref_aliases.items():
+ xref_aliases_complete[key] = val
config = Config(xref_aliases, xref_aliases_complete)
app = namedtuple("config", "config")(config)
update_config(app)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/tests/test_main.py
new/numpydoc-1.9.0/numpydoc/tests/test_main.py
--- old/numpydoc-1.8.0/numpydoc/tests/test_main.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/test_main.py 2025-06-24
14:22:17.000000000 +0200
@@ -117,26 +117,14 @@
assert exit_status == 0
[email protected]("args", [[], ["--ignore", "ES01", "SA01", "EX01"]])
[email protected]("args", [[], ["--ignore", "SS03"]])
def test_lint(capsys, args):
argv = ["lint", "numpydoc/__main__.py"] + args
if args:
expected = ""
expected_status = 0
else:
- expected = inspect.cleandoc(
- """
-
+------------------------+----------+---------+----------------------------+
- | file | item | check | description
|
-
+========================+==========+=========+============================+
- | numpydoc/__main__.py:1 | __main__ | ES01 | No extended
summary found |
-
+------------------------+----------+---------+----------------------------+
- | numpydoc/__main__.py:1 | __main__ | SA01 | See Also section
not found |
-
+------------------------+----------+---------+----------------------------+
- | numpydoc/__main__.py:1 | __main__ | EX01 | No examples
section found |
-
+------------------------+----------+---------+----------------------------+
- """
- )
+ expected = "numpydoc/__main__.py:1: SS03 Summary does not end with a
period"
expected_status = 1
return_status = numpydoc.cli.main(argv)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/tests/test_numpydoc.py
new/numpydoc-1.9.0/numpydoc/tests/test_numpydoc.py
--- old/numpydoc-1.8.0/numpydoc/tests/test_numpydoc.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/test_numpydoc.py 2025-06-24
14:22:17.000000000 +0200
@@ -36,6 +36,7 @@
class MockBuilder:
config = MockConfig()
+ _translator = None
class MockApp:
@@ -49,6 +50,7 @@
self.verbosity = 2
self._warncount = 0
self.warningiserror = False
+ self._exception_on_warning = False
def test_mangle_docstrings_basic():
@@ -142,7 +144,7 @@
assert _clean_text_signature("func($self, *args)") == "func(*args)"
[email protected]()
[email protected]
def f():
def _function_without_seealso_and_examples():
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/tests/test_validate.py
new/numpydoc-1.9.0/numpydoc/tests/test_validate.py
--- old/numpydoc-1.8.0/numpydoc/tests/test_validate.py 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc/tests/test_validate.py 2025-06-24
14:22:17.000000000 +0200
@@ -1198,6 +1198,113 @@
"""
+class ConstructorDocumentedInClassAndInit:
+ """
+ Class to test constructor documented via class and constructor docstrings.
+
+ A case where both the class docstring and the constructor docstring are
+ defined.
+
+ Parameters
+ ----------
+ param1 : int
+ Description of param1.
+
+ See Also
+ --------
+ otherclass : A class that does something else.
+
+ Examples
+ --------
+ This is an example of how to use ConstructorDocumentedInClassAndInit.
+ """
+
+ def __init__(self, param1: int) -> None:
+ """
+ Constructor docstring with additional information.
+
+ Extended information.
+
+ Parameters
+ ----------
+ param1 : int
+ Description of param1 with extra details.
+
+ See Also
+ --------
+ otherclass : A class that does something else.
+
+ Examples
+ --------
+ This is an example of how to use ConstructorDocumentedInClassAndInit.
+ """
+
+
+class ConstructorDocumentedInClass:
+ """
+ Class to test constructor documented via class docstring.
+
+ Useful to ensure that validation of `__init__` does not signal GL08,
+ when the class docstring properly documents the `__init__` constructor.
+
+ Parameters
+ ----------
+ param1 : int
+ Description of param1.
+
+ See Also
+ --------
+ otherclass : A class that does something else.
+
+ Examples
+ --------
+ This is an example of how to use ConstructorDocumentedInClass.
+ """
+
+ def __init__(self, param1: int) -> None:
+ pass
+
+
+class ConstructorDocumentedInClassWithNoParameters:
+ """
+ Class to test constructor documented via class docstring with no
parameters.
+
+ Useful to ensure that validation of `__init__` does not signal GL08,
+ when the class docstring properly documents the `__init__` constructor.
+
+ See Also
+ --------
+ otherclass : A class that does something else.
+
+ Examples
+ --------
+ This is an example of how to use
ConstructorDocumentedInClassWithNoParameters.
+ """
+
+ def __init__(self) -> None:
+ pass
+
+
+class IncompleteConstructorDocumentedInClass:
+ """
+ Class to test an incomplete constructor docstring.
+
+ This class does not properly document parameters.
+ Unnecessary extended summary.
+
+ See Also
+ --------
+ otherclass : A class that does something else.
+
+ Examples
+ --------
+ This is an example of how to use IncompleteConstructorDocumentedInClass.
+ """
+
+ def __init__(self, param1: int):
+ pass
+
+
class TestValidator:
def _import_path(self, klass=None, func=None):
"""
@@ -1536,6 +1643,40 @@
for msg in msgs:
assert msg in " ".join(err[1] for err in result["errors"])
+ @pytest.mark.parametrize(
+ "klass,exp_init_codes,exc_init_codes,exp_klass_codes",
+ [
+ ("ConstructorDocumentedInClass", tuple(), ("GL08",), tuple()),
+ ("ConstructorDocumentedInClassAndInit", tuple(), ("GL08",),
tuple()),
+ (
+ "ConstructorDocumentedInClassWithNoParameters",
+ tuple(),
+ ("GL08",),
+ tuple(),
+ ),
+ (
+ "IncompleteConstructorDocumentedInClass",
+ ("GL08",),
+ tuple(),
+ ("PR01"), # Parameter not documented in class constructor
+ ),
+ ],
+ )
+ def test_constructor_docstrings(
+ self, klass, exp_init_codes, exc_init_codes, exp_klass_codes
+ ):
+ # First test the class docstring itself, checking expected_klass_codes
match
+ result = validate_one(self._import_path(klass=klass))
+ for err in result["errors"]:
+ assert err[0] in exp_klass_codes
+
+ # Then test the constructor docstring
+ result = validate_one(self._import_path(klass=klass, func="__init__"))
+ for code in exp_init_codes:
+ assert code in " ".join(err[0] for err in result["errors"])
+ for code in exc_init_codes:
+ assert code not in " ".join(err[0] for err in result["errors"])
+
def decorator(x):
"""Test decorator."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc/validate.py
new/numpydoc-1.9.0/numpydoc/validate.py
--- old/numpydoc-1.8.0/numpydoc/validate.py 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/numpydoc/validate.py 2025-06-24 14:22:17.000000000
+0200
@@ -80,8 +80,7 @@
"PR06": 'Parameter "{param_name}" type should use "{right_type}" instead '
'of "{wrong_type}"',
"PR07": 'Parameter "{param_name}" has no description',
- "PR08": 'Parameter "{param_name}" description should start with a '
- "capital letter",
+ "PR08": 'Parameter "{param_name}" description should start with a capital
letter',
"PR09": 'Parameter "{param_name}" description should finish with "."',
"PR10": 'Parameter "{param_name}" requires a space before the colon '
"separating the parameter name and type",
@@ -278,6 +277,10 @@
return inspect.isfunction(self.obj)
@property
+ def is_mod(self):
+ return inspect.ismodule(self.obj)
+
+ @property
def is_generator_function(self):
return inspect.isgeneratorfunction(_unwrap(self.obj))
@@ -633,7 +636,29 @@
errs = []
if not doc.raw_doc:
- if "GL08" not in ignore_validation_comments:
+ report_GL08: bool = True
+ # Check if the object is a class and has a docstring in the constructor
+ # Also check if code_obj is defined, as undefined for the AstValidator
in validate_docstrings.py.
+ if (
+ doc.name.endswith(".__init__")
+ and doc.is_function_or_method
+ and hasattr(doc, "code_obj")
+ ):
+ cls_name = doc.code_obj.__qualname__.split(".")[0]
+ cls = Validator._load_obj(f"{doc.code_obj.__module__}.{cls_name}")
+ # cls = Validator._load_obj(f"{doc.name[:-9]}.{cls_name}") ##
Alternative
+ cls_doc = Validator(get_doc_object(cls))
+
+ # Parameter_mismatches, PR01, PR02, PR03 are checked for the class
docstring.
+ # If cls_doc has PR01, PR02, PR03 errors, i.e. invalid class
docstring,
+ # then we also report missing constructor docstring, GL08.
+ report_GL08 = len(cls_doc.parameter_mismatches) > 0
+
+ # Check if GL08 is to be ignored:
+ if "GL08" in ignore_validation_comments:
+ report_GL08 = False
+ # Add GL08 error?
+ if report_GL08:
errs.append(error("GL08"))
return {
"type": doc.type,
@@ -685,12 +710,18 @@
errs.append(error("SS03"))
if doc.summary != doc.summary.lstrip():
errs.append(error("SS04"))
- elif doc.is_function_or_method and doc.summary.split(" ")[0][-1] ==
"s":
+ # Heuristic to check for infinitive verbs - shouldn't end in "s"
+ elif (
+ doc.is_function_or_method
+ and len(doc.summary.split(" ")[0]) > 1
+ and doc.summary.split(" ")[0][-1] == "s"
+ and doc.summary.split(" ")[0][-2] != "s"
+ ):
errs.append(error("SS05"))
if doc.num_summary_lines > 1:
errs.append(error("SS06"))
- if not doc.extended_summary:
+ if not doc.is_mod and not doc.extended_summary:
errs.append(("ES01", "No extended summary found"))
# PR01: Parameters not documented
@@ -742,20 +773,21 @@
if not doc.yields and doc.is_generator_function:
errs.append(error("YD01"))
- if not doc.see_also:
- errs.append(error("SA01"))
- else:
- for rel_name, rel_desc in doc.see_also.items():
- if rel_desc:
- if not rel_desc.endswith("."):
- errs.append(error("SA02", reference_name=rel_name))
- if rel_desc[0].isalpha() and not rel_desc[0].isupper():
- errs.append(error("SA03", reference_name=rel_name))
- else:
- errs.append(error("SA04", reference_name=rel_name))
+ if not doc.is_mod:
+ if not doc.see_also:
+ errs.append(error("SA01"))
+ else:
+ for rel_name, rel_desc in doc.see_also.items():
+ if rel_desc:
+ if not rel_desc.endswith("."):
+ errs.append(error("SA02", reference_name=rel_name))
+ if rel_desc[0].isalpha() and not rel_desc[0].isupper():
+ errs.append(error("SA03", reference_name=rel_name))
+ else:
+ errs.append(error("SA04", reference_name=rel_name))
- if not doc.examples:
- errs.append(error("EX01"))
+ if not doc.examples:
+ errs.append(error("EX01"))
errs = [err for err in errs if err[0] not in ignore_validation_comments]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc.egg-info/PKG-INFO
new/numpydoc-1.9.0/numpydoc.egg-info/PKG-INFO
--- old/numpydoc-1.8.0/numpydoc.egg-info/PKG-INFO 2024-08-09
17:52:01.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc.egg-info/PKG-INFO 2025-06-24
14:22:24.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: numpydoc
-Version: 1.8.0
+Version: 1.9.0
Summary: Sphinx extension to support docstrings in Numpy format
Author-email: Pauli Virtanen and others <[email protected]>
License: Copyright (C) 2008-2023 Stefan van der Walt <[email protected]>,
Pauli Virtanen <[email protected]>
@@ -42,26 +42,14 @@
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Documentation
Requires-Python: >=3.9
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
Requires-Dist: sphinx>=6
-Requires-Dist: tabulate>=0.8.10
Requires-Dist: tomli>=1.1.0; python_version < "3.11"
-Provides-Extra: developer
-Requires-Dist: pre-commit>=3.3; extra == "developer"
-Requires-Dist: tomli; python_version < "3.11" and extra == "developer"
-Provides-Extra: doc
-Requires-Dist: numpy>=1.22; extra == "doc"
-Requires-Dist: matplotlib>=3.5; extra == "doc"
-Requires-Dist: pydata-sphinx-theme>=0.13.3; extra == "doc"
-Requires-Dist: sphinx>=7; extra == "doc"
-Requires-Dist: intersphinx_registry; extra == "doc"
-Provides-Extra: test
-Requires-Dist: pytest; extra == "test"
-Requires-Dist: pytest-cov; extra == "test"
-Requires-Dist: matplotlib; extra == "test"
+Dynamic: license-file
=====================================
numpydoc -- Numpy's Sphinx extensions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc.egg-info/SOURCES.txt
new/numpydoc-1.9.0/numpydoc.egg-info/SOURCES.txt
--- old/numpydoc-1.8.0/numpydoc.egg-info/SOURCES.txt 2024-08-09
17:52:01.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc.egg-info/SOURCES.txt 2025-06-24
14:22:24.000000000 +0200
@@ -47,8 +47,4 @@
numpydoc/tests/tinybuild/Makefile
numpydoc/tests/tinybuild/conf.py
numpydoc/tests/tinybuild/index.rst
-numpydoc/tests/tinybuild/numpydoc_test_module.py
-requirements/default.txt
-requirements/developer.txt
-requirements/doc.txt
-requirements/test.txt
\ No newline at end of file
+numpydoc/tests/tinybuild/numpydoc_test_module.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/numpydoc.egg-info/requires.txt
new/numpydoc-1.9.0/numpydoc.egg-info/requires.txt
--- old/numpydoc-1.8.0/numpydoc.egg-info/requires.txt 2024-08-09
17:52:01.000000000 +0200
+++ new/numpydoc-1.9.0/numpydoc.egg-info/requires.txt 2025-06-24
14:22:24.000000000 +0200
@@ -1,23 +1,4 @@
sphinx>=6
-tabulate>=0.8.10
[:python_version < "3.11"]
tomli>=1.1.0
-
-[developer]
-pre-commit>=3.3
-
-[developer:python_version < "3.11"]
-tomli
-
-[doc]
-numpy>=1.22
-matplotlib>=3.5
-pydata-sphinx-theme>=0.13.3
-sphinx>=7
-intersphinx_registry
-
-[test]
-pytest
-pytest-cov
-matplotlib
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/pyproject.toml
new/numpydoc-1.9.0/pyproject.toml
--- old/numpydoc-1.8.0/pyproject.toml 2024-08-09 17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/pyproject.toml 2025-06-24 14:22:17.000000000 +0200
@@ -24,11 +24,11 @@
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
+ 'Programming Language :: Python :: 3.13',
'Topic :: Documentation',
]
dependencies = [
'sphinx>=6',
- 'tabulate>=0.8.10',
"tomli>=1.1.0;python_version<'3.11'",
]
@@ -43,10 +43,12 @@
Homepage = 'https://numpydoc.readthedocs.io'
Source = 'https://github.com/numpy/numpydoc/'
-[project.optional-dependencies]
-developer = [
+[dependency-groups]
+dev = [
'pre-commit>=3.3',
"tomli; python_version < '3.11'",
+ { include-group = "doc" },
+ { include-group = "test" }
]
doc = [
'numpy>=1.22',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/requirements/default.txt
new/numpydoc-1.9.0/requirements/default.txt
--- old/numpydoc-1.8.0/requirements/default.txt 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/requirements/default.txt 1970-01-01 01:00:00.000000000
+0100
@@ -1,5 +0,0 @@
-# Generated via tools/generate_requirements.py and pre-commit hook.
-# Do not edit this file; modify pyproject.toml instead.
-sphinx>=6
-tabulate>=0.8.10
-tomli>=1.1.0;python_version<'3.11'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/requirements/developer.txt
new/numpydoc-1.9.0/requirements/developer.txt
--- old/numpydoc-1.8.0/requirements/developer.txt 2024-08-09
17:51:54.000000000 +0200
+++ new/numpydoc-1.9.0/requirements/developer.txt 1970-01-01
01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-# Generated via tools/generate_requirements.py and pre-commit hook.
-# Do not edit this file; modify pyproject.toml instead.
-pre-commit>=3.3
-tomli; python_version < '3.11'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/requirements/doc.txt
new/numpydoc-1.9.0/requirements/doc.txt
--- old/numpydoc-1.8.0/requirements/doc.txt 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/requirements/doc.txt 1970-01-01 01:00:00.000000000
+0100
@@ -1,7 +0,0 @@
-# Generated via tools/generate_requirements.py and pre-commit hook.
-# Do not edit this file; modify pyproject.toml instead.
-numpy>=1.22
-matplotlib>=3.5
-pydata-sphinx-theme>=0.13.3
-sphinx>=7
-intersphinx_registry
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numpydoc-1.8.0/requirements/test.txt
new/numpydoc-1.9.0/requirements/test.txt
--- old/numpydoc-1.8.0/requirements/test.txt 2024-08-09 17:51:54.000000000
+0200
+++ new/numpydoc-1.9.0/requirements/test.txt 1970-01-01 01:00:00.000000000
+0100
@@ -1,5 +0,0 @@
-# Generated via tools/generate_requirements.py and pre-commit hook.
-# Do not edit this file; modify pyproject.toml instead.
-pytest
-pytest-cov
-matplotlib