From ccd026593f41c4bdbed50a6b1fa7fbe39037224e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Berker=20=C5=9EAL?= Date: Mon, 2 Dec 2024 15:25:39 +0100 Subject: [PATCH 1/3] Respect docstring-min-length in docparams extension Even though visit_functiondef is checking for docstring-min-length, it is not enough. This commit fixes the issue by adding the same check to visit_raise and visit_yield --- pylint/extensions/docparams.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/pylint/extensions/docparams.py b/pylint/extensions/docparams.py index b19560b7fb..eabdb34411 100644 --- a/pylint/extensions/docparams.py +++ b/pylint/extensions/docparams.py @@ -209,9 +209,7 @@ def visit_functiondef(self, node: nodes.FunctionDef) -> None: return # skip functions smaller than 'docstring-min-length' - lines = checker_utils.get_node_last_lineno(node) - node.lineno - max_lines = self.linter.config.docstring_min_length - if max_lines > -1 and lines < max_lines: + if self._is_shorter_than_min_length(node): return self.check_functiondef_params(node, node_doc) @@ -281,6 +279,10 @@ def visit_raise(self, node: nodes.Raise) -> None: if not isinstance(func_node, astroid.FunctionDef): return + # skip functions smaller than 'docstring-min-length' + if self._is_shorter_than_min_length(node): + return + # skip functions that match the 'no-docstring-rgx' config option no_docstring_rgx = self.linter.config.no_docstring_rgx if no_docstring_rgx and re.match(no_docstring_rgx, func_node.name): @@ -364,6 +366,10 @@ def visit_yield(self, node: nodes.Yield | nodes.YieldFrom) -> None: if self.linter.config.accept_no_yields_doc: return + # skip functions smaller than 'docstring-min-length' + if self._is_shorter_than_min_length(node): + return + func_node: astroid.FunctionDef = node.frame() # skip functions that match the 'no-docstring-rgx' config option @@ -671,6 +677,18 @@ def _add_raise_message( confidence=HIGH, ) + def _is_shorter_than_min_length(self, node: nodes.FunctionDef) -> bool: + """Returns true on functions smaller than 'docstring-min-length'. + + :param node: Node for a function or method definition in the AST + :type node: :class:`astroid.scoped_nodes.Function` + + :rtype: bool + """ + node_line_count = checker_utils.get_node_last_lineno(node) - node.lineno + min_lines = self.linter.config.docstring_min_length + return -1 < node_line_count < min_lines + def register(linter: PyLinter) -> None: linter.register_checker(DocstringParameterChecker(linter)) From 51797ab8d868b0352eabbd20e0a177d6e6558d8a Mon Sep 17 00:00:00 2001 From: "berker.sal" Date: Fri, 6 Dec 2024 16:20:56 +0100 Subject: [PATCH 2/3] Functional tests for docparams extension docstring-min-length fix --- .../raise/missing_raises_doc_required_min_length.py | 10 ++++++++++ .../raise/missing_raises_doc_required_min_length.rc | 7 +++++++ .../yield/missing_yield_doc_required_min_length.py | 10 ++++++++++ .../yield/missing_yield_doc_required_min_length.rc | 7 +++++++ 4 files changed, 34 insertions(+) create mode 100644 tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.py create mode 100644 tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.rc create mode 100644 tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.py create mode 100644 tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.rc diff --git a/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.py b/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.py new file mode 100644 index 0000000000..b5a487ca63 --- /dev/null +++ b/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.py @@ -0,0 +1,10 @@ +"""Tests for missing-raises-doc for non-specified style docstrings +with accept-no-raise-doc = no and docstring-min-length = 3 +""" +# pylint: disable=invalid-name, broad-exception-raised + +# Example of a function that is less than 'docstring-min-length' config option +# No error message is emitted. +def test_skip_docstring_min_length(): + """function is too short and is missing raise documentation""" + raise Exception diff --git a/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.rc b/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.rc new file mode 100644 index 0000000000..6c6bb7072f --- /dev/null +++ b/tests/functional/ext/docparams/raise/missing_raises_doc_required_min_length.rc @@ -0,0 +1,7 @@ +[MAIN] +load-plugins = pylint.extensions.docparams + +[BASIC] +accept-no-raise-doc=no +docstring-min-length=3 +no-docstring-rgx=^$ diff --git a/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.py b/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.py new file mode 100644 index 0000000000..72d8f845a3 --- /dev/null +++ b/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.py @@ -0,0 +1,10 @@ +"""Tests for missing-yield-doc for non-specified style docstrings +with accept-no-yields-doc = no and docstring-min-length = 3 +""" +# pylint: disable=invalid-name + +# Example of a function that is less than 'docstring-min-length' config option +# No error message is emitted. +def test_skip_docstring_min_length(): + """function is too short and is missing yield documentation""" + yield None diff --git a/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.rc b/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.rc new file mode 100644 index 0000000000..789ae21b57 --- /dev/null +++ b/tests/functional/ext/docparams/yield/missing_yield_doc_required_min_length.rc @@ -0,0 +1,7 @@ +[MAIN] +load-plugins = pylint.extensions.docparams + +[BASIC] +accept-no-yields-doc=no +docstring-min-length=3 +no-docstring-rgx=^$ From 274a61477e5259722eca2fc39daea379d2bd78d8 Mon Sep 17 00:00:00 2001 From: berkersal Date: Sun, 25 May 2025 19:13:47 +0200 Subject: [PATCH 3/3] Changelog for docparams extension docstring-min-length fix --- doc/whatsnew/fragments/10104.false_positive | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/whatsnew/fragments/10104.false_positive diff --git a/doc/whatsnew/fragments/10104.false_positive b/doc/whatsnew/fragments/10104.false_positive new file mode 100644 index 0000000000..3a036d5a50 --- /dev/null +++ b/doc/whatsnew/fragments/10104.false_positive @@ -0,0 +1,3 @@ +Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length. + +Refs #10104