Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ruff-0.9] Stabilise two pydoclint rules #15326

Closed
wants to merge 1 commit into from

Conversation

AlexWaygood
Copy link
Member

Summary

Stabilise two pydoclint rules for Ruff 0.9:

There are no open issues about either of these, and they've been in preview for three months now. The only open PR about them is #13286, which could easily be a preview-only change; I don't think it needs to block the rules being stabilised.

Test Plan

Ecosystem check on this PR.

@AlexWaygood AlexWaygood added rule Implementing or modifying a lint rule docstring Related to docstring linting or formatting labels Jan 7, 2025
@AlexWaygood
Copy link
Member Author

I opened a separate PR here to improve the documentation: #15325. I separated it out as it also touches other rules, and it can be merged even if we decide not to stabilise these rules.

Copy link
Contributor

github-actions bot commented Jan 7, 2025

ruff-ecosystem results

Linter (stable)

ℹ️ ecosystem check detected linter changes. (+98 -0 violations, +0 -0 fixes in 5 projects; 50 projects unchanged)

apache/superset (+2 -0 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --no-preview --select ALL

+ scripts/cancel_github_workflows.py:67:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ superset/daos/tag.py:340:9: DOC202 Docstring should not have a returns section because the function doesn't return anything

bokeh/bokeh (+78 -0 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --no-preview --select ALL

+ src/bokeh/__init__.py:63:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/application/handlers/code_runner.py:193:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/client/connection.py:168:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/client/connection.py:200:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/client/session.py:389:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/client/session.py:402:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/command/bootstrap.py:72:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/has_props.py:422:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/has_props.py:457:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/has_props.py:690:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/has_props.py:738:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:293:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:397:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:430:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:564:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:626:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:662:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:716:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:783:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ src/bokeh/core/property/descriptors.py:849:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
... 58 additional changes omitted for rule DOC202
+ src/bokeh/core/query.py:65:5: DOC403 Docstring has a "Yields" section but the function doesn't yield anything
... 57 additional changes omitted for project

pandas-dev/pandas (+0 -0 violations, +0 -0 fixes)


pdm-project/pdm (+4 -0 violations, +0 -0 fixes)

+ src/pdm/cli/commands/cache.py:37:47: FA100 Add `from __future__ import annotations` to simplify `typing.Iterable`
+ src/pdm/cli/commands/cache.py:97:20: FA100 Add `from __future__ import annotations` to simplify `typing.Iterable`
+ src/pdm/cli/commands/config.py:102:36: FA100 Add `from __future__ import annotations` to simplify `typing.Mapping`
+ src/pdm/cli/commands/config.py:102:67: FA100 Add `from __future__ import annotations` to simplify `typing.Mapping`

astropy/astropy (+14 -0 violations, +0 -0 fixes)

+ astropy/constants/utils.py:8:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/coordinates/calculation.py:122:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/io/ascii/basic.py:339:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/io/ascii/daophot.py:150:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/io/votable/connect.py:186:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/io/votable/util.py:25:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/table/column.py:809:9: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/table/info.py:130:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/utils/data.py:212:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
+ astropy/utils/data.py:518:5: DOC202 Docstring should not have a returns section because the function doesn't return anything
... 4 additional changes omitted for project

Changes by rule (3 rules affected)

code total + violation - violation + fix - fix
DOC202 93 93 0 0 0
FA100 4 4 0 0 0
DOC403 1 1 0 0 0

Linter (preview)

ℹ️ ecosystem check detected linter changes. (+2532 -1599 violations, +4 -0 fixes in 30 projects; 25 projects unchanged)

RasaHQ/rasa (+1 -1 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

+ tests/core/training/test_interactive.py:663:58: RUF025 [*] Unnecessary empty iterable within a deque call
- tests/core/training/test_interactive.py:663:58: RUF037 [*] Unnecessary empty iterable within a deque call

aiven/aiven-client (+409 -0 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

+ aiven/client/argx.py:104:38: UP006 Use `collections.abc.Iterable` instead of `Iterable` for type annotation
+ aiven/client/argx.py:155:54: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:171:45: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:174:49: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:241:29: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:278:34: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:278:44: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:290:32: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
+ aiven/client/argx.py:300:29: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ aiven/client/argx.py:303:34: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
... 399 additional changes omitted for project

PlasmaPy/PlasmaPy (+0 -4 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

- tests/particles/test_decorators.py:437:5: B903 Class could be dataclass or namedtuple
- tests/particles/test_decorators.py:456:5: B903 Class could be dataclass or namedtuple
- tests/particles/test_decorators.py:494:5: B903 Class could be dataclass or namedtuple
- tests/particles/test_decorators_annotations.py:16:1: B903 Class could be dataclass or namedtuple

apache/airflow (+487 -11 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview --select ALL

+ airflow/api/auth/backend/deny_all.py:34:24: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ airflow/api_connexion/parameters.py:87:24: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ airflow/api_connexion/parameters.py:90:52: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ airflow/api_connexion/parameters.py:90:78: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ airflow/api_connexion/security.py:114:6: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ airflow/api_connexion/security.py:161:54: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
... 478 additional changes omitted for rule UP006
+ airflow/utils/log/logging_mixin.py:175:9: PLR6301 Method `writable` could be a function, class method, or static method
- airflow/utils/log/logging_mixin.py:175:9: PLR6301 Method `writable` could be a function, class method, or static method
+ airflow/utils/log/logging_mixin.py:1:1: CPY001 Missing copyright notice at top of file
- airflow/utils/log/logging_mixin.py:1:1: CPY001 Missing copyright notice at top of file
... 488 additional changes omitted for project

apache/superset (+246 -80 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview --select ALL

+ scripts/check-env.py:37:40: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ superset/advanced_data_type/types.py:58:21: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ superset/advanced_data_type/types.py:59:23: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ superset/async_events/async_query_manager.py:106:22: UP007 Use `X | Y` for type annotations
- superset/async_events/async_query_manager.py:106:22: UP045 Use `X | None` for type annotations
+ superset/async_events/async_query_manager.py:108:29: UP007 Use `X | Y` for type annotations
- superset/async_events/async_query_manager.py:108:29: UP045 Use `X | None` for type annotations
+ superset/async_events/async_query_manager.py:109:38: UP007 Use `X | Y` for type annotations
- superset/async_events/async_query_manager.py:109:38: UP045 Use `X | None` for type annotations
+ superset/async_events/async_query_manager.py:112:34: UP007 Use `X | Y` for type annotations
... 316 additional changes omitted for project

bokeh/bokeh (+250 -0 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview --select ALL

+ release/action.py:27:31: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ release/action.py:27:52: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
+ release/action.py:35:47: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
+ release/build.py:144:22: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ release/credentials.py:37:22: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ release/credentials.py:40:38: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ release/pipeline.py:24:12: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ release/pipeline.py:34:31: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
+ release/ui.py:103:33: UP006 Use `collections.abc.Sequence` instead of `Sequence` for type annotation
+ release/ui.py:24:17: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
... 240 additional changes omitted for project

ibis-project/ibis (+3 -102 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

- ibis/backends/bigquery/__init__.py:847:48: UP045 [*] Use `X | None` for type annotations
- ibis/common/graph.py:171:46: UP045 [*] Use `X | None` for type annotations
- ibis/common/graph.py:203:50: UP045 [*] Use `X | None` for type annotations
- ibis/common/graph.py:275:41: UP045 [*] Use `X | None` for type annotations
- ibis/common/graph.py:310:47: UP045 [*] Use `X | None` for type annotations
- ibis/common/graph.py:359:47: UP045 [*] Use `X | None` for type annotations
... 97 additional changes omitted for rule UP045
+ ibis/common/tests/test_patterns.py:1122:13: UP006 [*] Use `collections.abc.Callable` instead of `Callable` for type annotation
+ ibis/common/tests/test_patterns.py:1125:10: UP006 [*] Use `collections.abc.Callable` instead of `Callable` for type annotation
+ ibis/common/tests/test_patterns.py:731:31: UP006 [*] Use `collections.abc.Callable` instead of `Callable` for type annotation
... 96 additional changes omitted for project

langchain-ai/langchain (+299 -1149 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

+ libs/core/langchain_core/_api/beta_decorator.py:128:35: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ libs/core/langchain_core/_api/beta_decorator.py:186:35: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ libs/core/langchain_core/_api/beta_decorator.py:201:35: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ libs/core/langchain_core/_api/beta_decorator.py:30:30: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ libs/core/langchain_core/_api/beta_decorator.py:39:6: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ libs/core/langchain_core/_api/deprecation.py:202:35: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
... 294 additional changes omitted for rule UP006
- libs/core/langchain_core/caches.py:149:36: UP045 Use `X | None` for type annotations
- libs/core/langchain_core/caches.py:167:55: UP045 Use `X | None` for type annotations
- libs/core/langchain_core/caches.py:200:62: UP045 Use `X | None` for type annotations
- libs/core/langchain_core/caches.py:52:55: UP045 Use `X | None` for type annotations
- libs/core/langchain_core/caches.py:97:62: UP045 Use `X | None` for type annotations
- libs/core/langchain_core/callbacks/base.py:104:24: UP045 Use `X | None` for type annotations
... 1143 additional changes omitted for rule UP045
- libs/core/tests/unit_tests/tracers/test_langchain.py:103:5: B903 Class could be dataclass or namedtuple
... 1435 additional changes omitted for project

latchbio/latch (+13 -13 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

+ src/latch/registry/record.py:188:57: UP007 Use `X | Y` for type annotations
- src/latch/registry/record.py:188:57: UP045 Use `X | None` for type annotations
+ src/latch/registry/record.py:190:64: UP007 Use `X | Y` for type annotations
- src/latch/registry/record.py:190:64: UP045 Use `X | None` for type annotations
+ src/latch/registry/record.py:215:53: UP007 Use `X | Y` for type annotations
- src/latch/registry/record.py:215:53: UP045 Use `X | None` for type annotations
+ src/latch/registry/record.py:217:60: UP007 Use `X | Y` for type annotations
- src/latch/registry/record.py:217:60: UP045 Use `X | None` for type annotations
+ src/latch/registry/record.py:250:10: UP007 Use `X | Y` for type annotations
- src/latch/registry/record.py:250:10: UP045 Use `X | None` for type annotations
... 16 additional changes omitted for project

lnbits/lnbits (+47 -208 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --output-format concise --preview

+ lnbits/app.py:342:46: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ lnbits/app.py:352:47: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
- lnbits/core/models.py:102:15: UP045 Use `X | None` for type annotations
- lnbits/core/models.py:107:20: UP045 Use `X | None` for type annotations
- lnbits/core/models.py:108:15: UP045 Use `X | None` for type annotations
- lnbits/core/models.py:109:15: UP045 Use `X | None` for type annotations
- lnbits/core/models.py:110:12: UP045 Use `X | None` for type annotations
- lnbits/core/models.py:111:19: UP045 Use `X | None` for type annotations
... 203 additional changes omitted for rule UP045
+ lnbits/core/models.py:332:30: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
+ lnbits/core/models.py:333:31: UP006 Use `collections.abc.Callable` instead of `Callable` for type annotation
... 245 additional changes omitted for project

... Truncated remaining completed project reports due to GitHub comment length restrictions

Changes by rule (11 rules affected)

code total + violation - violation + fix - fix
UP006 2431 2431 0 0 0
UP045 1552 0 1552 0 0
UP007 92 92 0 0 0
B903 40 0 40 0 0
FA100 4 4 0 0 0
FURB171 4 0 0 4 0
RUF025 3 3 0 0 0
RUF037 3 0 3 0 0
PLR6301 2 1 1 0 0
CPY001 2 1 1 0 0
RUF100 2 0 2 0 0

@AlexWaygood
Copy link
Member Author

False positive here in the ecosystem report: https://github.com/bokeh/bokeh/blob/829b2a75c402d0d0abd7e37ff201fbdfd949d857/src/bokeh/core/query.py#L65

the function returns a generator expression, which comes to the same thing as explicitly yielding using a yield statement

@AlexWaygood
Copy link
Member Author

A bunch of the DOC202 ecosystem hits are clearly true positives that should be fixed (e.g. there are a bunch of generator functions that yield things but don't return anything, yet still have "Returns" sections, which is kinda confusing). But many are just because people have things like this in their docstrings for functions that have no explicit return statements:

def foo():
    """Does fooey things.

    Returns:
        None.
    """

That seems pretty reasonable to me, honestly. Maybe we could consider making it configurable so that it's ignored for functions with -> None as the return annotation...?

@AlexWaygood
Copy link
Member Author

AlexWaygood commented Jan 7, 2025

Anyway, given the open questions here and the large fallout, I'm now leaning towards not stabilising either of these just yet.

(Though note that a lot of the ecosystem hits are regarding other rules; I'm not sure why they're showing up here. Possibly because the ruff-0.9 branch is out of date with the main branch.)

@dylwil3
Copy link
Collaborator

dylwil3 commented Jan 7, 2025

I agree this too disruptive to stabilize just now without further discussion.

In fact, I guess these ecosystem results are making me revise my earlier opinion: maybe there is a relationship with DOC201/DOC402. A developer may want to insist on documenting all return types, even when they are None, or make an exception for Nones... and it's not clear whether to use provided annotations as a guidepost for that decision.

@AlexWaygood AlexWaygood closed this Jan 7, 2025
@AlexWaygood AlexWaygood deleted the alex/pydoclint-stabilise branch January 7, 2025 20:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docstring Related to docstring linting or formatting rule Implementing or modifying a lint rule
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants