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

[pydocstyle] Improve heuristics for detecting Google-style docstrings #13142

Merged
merged 1 commit into from
Aug 29, 2024

Conversation

AlexWaygood
Copy link
Member

@AlexWaygood AlexWaygood commented Aug 28, 2024

Summary

This PR improves our heuristics for detecting which docstring convention users have in their docstrings. Specifically, we used to infer the following docstring as being a numpy-style docstring, when it's clearly a Google-style docstring (because the section title ends with a colon, and does not have an underline on the following line):

def foo(a: str) -> str:
    """Foo bar.

    Examples:
        Some explanation here.
        >>> bla bla bla

    """
    return a

While fixing the bug, I noticed that we were also checking D407 on docstrings we infer as being Google-style, even though our docs say we don't. I fixed that as well in this PR, since otherwise the fixture I added would have led to an incorrect snapshot being added (D407 would have been emitted on the snippet, when it shouldn't have been). This D407 change resulted in a several changes to the existing snapshots, but I think they're all for the better. It looks like we no longer emit D407 on several docstrings in our fixtures that seem pretty clearly to be Google-style docstrings to me, and this rule definitely shouldn't be enforced for Google-style docstrings in my opinion.

Fixes #13139

Test Plan

  • cargo test -p ruff_linter --lib
  • Ecosystem report

@AlexWaygood AlexWaygood added bug Something isn't working docstring Related to docstring linting or formatting labels Aug 28, 2024
Copy link
Contributor

ruff-ecosystem results

Linter (stable)

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

apache/airflow (+0 -34 violations, +0 -0 fixes)

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

- airflow/decorators/base.py:137:5: D407 [*] Missing dashed underline after section ("Example")
- airflow/hooks/filesystem.py:32:5: D407 [*] Missing dashed underline after section ("example")
- airflow/models/dag.py:3909:5: D407 [*] Missing dashed underline after section ("Args")
- airflow/providers/amazon/aws/hooks/s3.py:1401:9: D407 [*] Missing dashed underline after section ("Note")
- airflow/providers/amazon/aws/operators/base_aws.py:40:5: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/amazon/aws/operators/base_aws.py:40:5: D407 [*] Missing dashed underline after section ("Examples")
- airflow/providers/amazon/aws/sensors/base_aws.py:40:5: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/amazon/aws/sensors/base_aws.py:40:5: D407 [*] Missing dashed underline after section ("Examples")
... 15 additional changes omitted for rule D407
- airflow/providers/amazon/aws/utils/mixins.py:69:9: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/apache/hive/hooks/hive.py:840:5: D406 [*] Section name should end with a newline ("Notes")
... 24 additional changes omitted for project

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

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

- scripts/cancel_github_workflows.py:21:1: D407 [*] Missing dashed underline after section ("Example")
- scripts/cancel_github_workflows.py:68:5: D406 [*] Section name should end with a newline ("Returns")
- scripts/cancel_github_workflows.py:68:5: D407 [*] Missing dashed underline after section ("Returns")
- superset/cli/test_db.py:154:5: D407 [*] Missing dashed underline after section ("TODO")
- superset/commands/chart/importers/v1/utils.py:35:5: D407 [*] Missing dashed underline after section ("TODO")
- superset/commands/sql_lab/query.py:39:5: D406 [*] Section name should end with a newline ("Attributes")
- superset/commands/sql_lab/query.py:39:5: D407 [*] Missing dashed underline after section ("Attributes")
- superset/daos/tag.py:312:9: D407 [*] Missing dashed underline after section ("Args")
... 7 additional changes omitted for rule D407
- superset/db_engine_specs/base.py:194:5: D406 [*] Section name should end with a newline ("Attributes")
... 6 additional changes omitted for project

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

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

- src/bokeh/__init__.py:65:5: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/__init__.py:65:5: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:157:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:253:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:256:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:340:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:344:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:91:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:95:9: D407 [*] Missing dashed underline after section ("Keyword Args")
- src/bokeh/application/handlers/code.py:139:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code.py:85:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:171:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/application/handlers/code_runner.py:171:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/code_runner.py:207:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:75:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:89:9: D407 [*] Missing dashed underline after section ("Raises")
- src/bokeh/application/handlers/directory.py:247:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:261:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:276:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:286:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:296:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:299:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/function.py:94:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/handler.py:134:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/handler.py:137:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/handler.py:150:9: D407 [*] Missing dashed underline after section ("Args")
... 918 additional changes omitted for rule D407
- src/bokeh/client/connection.py:174:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/connection.py:242:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:395:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:407:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:473:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:175:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:187:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:199:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:238:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:317:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:332:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:345:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:355:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:406:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:456:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:468:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:478:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/command/subcommands/file_output.py:222:9: D406 [*] Section name should end with a newline ("Raises")
- src/bokeh/core/has_props.py:459:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/core/has_props.py:462:9: D406 [*] Section name should end with a newline ("Examples")
- src/bokeh/core/has_props.py:529:9: D406 [*] Section name should end with a newline ("Returns")
... 1034 additional changes omitted for project

zulip/zulip (+0 -17 violations, +0 -0 fixes)

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

- zerver/data_import/slack.py:158:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:158:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:253:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:253:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:510:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:510:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:733:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:733:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:876:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:876:5: D407 [*] Missing dashed underline after section ("Returns")
... 7 additional changes omitted for project

Changes by rule (2 rules affected)

code total + violation - violation + fix - fix
D407 983 0 983 0 0
D406 164 0 164 0 0

Linter (preview)

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

apache/airflow (+0 -34 violations, +0 -0 fixes)

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

- airflow/decorators/base.py:137:5: D407 [*] Missing dashed underline after section ("Example")
- airflow/hooks/filesystem.py:32:5: D407 [*] Missing dashed underline after section ("example")
- airflow/models/dag.py:3909:5: D407 [*] Missing dashed underline after section ("Args")
- airflow/providers/amazon/aws/hooks/s3.py:1401:9: D407 [*] Missing dashed underline after section ("Note")
- airflow/providers/amazon/aws/operators/base_aws.py:40:5: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/amazon/aws/operators/base_aws.py:40:5: D407 [*] Missing dashed underline after section ("Examples")
- airflow/providers/amazon/aws/sensors/base_aws.py:40:5: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/amazon/aws/sensors/base_aws.py:40:5: D407 [*] Missing dashed underline after section ("Examples")
... 15 additional changes omitted for rule D407
- airflow/providers/amazon/aws/utils/mixins.py:69:9: D406 [*] Section name should end with a newline ("Examples")
- airflow/providers/apache/hive/hooks/hive.py:840:5: D406 [*] Section name should end with a newline ("Notes")
... 24 additional changes omitted for project

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

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

- scripts/cancel_github_workflows.py:21:1: D407 [*] Missing dashed underline after section ("Example")
- scripts/cancel_github_workflows.py:68:5: D406 [*] Section name should end with a newline ("Returns")
- scripts/cancel_github_workflows.py:68:5: D407 [*] Missing dashed underline after section ("Returns")
- superset/cli/test_db.py:154:5: D407 [*] Missing dashed underline after section ("TODO")
- superset/commands/chart/importers/v1/utils.py:35:5: D407 [*] Missing dashed underline after section ("TODO")
- superset/commands/sql_lab/query.py:39:5: D406 [*] Section name should end with a newline ("Attributes")
- superset/commands/sql_lab/query.py:39:5: D407 [*] Missing dashed underline after section ("Attributes")
- superset/daos/tag.py:312:9: D407 [*] Missing dashed underline after section ("Args")
... 7 additional changes omitted for rule D407
- superset/db_engine_specs/base.py:194:5: D406 [*] Section name should end with a newline ("Attributes")
... 6 additional changes omitted for project

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

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

- src/bokeh/__init__.py:65:5: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/__init__.py:65:5: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:157:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:253:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:256:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:340:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:344:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/application.py:91:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/application.py:95:9: D407 [*] Missing dashed underline after section ("Keyword Args")
- src/bokeh/application/handlers/code.py:139:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code.py:85:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:171:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/application/handlers/code_runner.py:171:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/code_runner.py:207:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:75:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/code_runner.py:89:9: D407 [*] Missing dashed underline after section ("Raises")
- src/bokeh/application/handlers/directory.py:247:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:261:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:276:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:286:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:296:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/directory.py:299:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/function.py:94:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/handler.py:134:9: D407 [*] Missing dashed underline after section ("Args")
- src/bokeh/application/handlers/handler.py:137:9: D407 [*] Missing dashed underline after section ("Returns")
- src/bokeh/application/handlers/handler.py:150:9: D407 [*] Missing dashed underline after section ("Args")
... 918 additional changes omitted for rule D407
- src/bokeh/client/connection.py:174:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/connection.py:242:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:395:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:407:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/client/session.py:473:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:175:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:187:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:199:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:238:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:317:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:332:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:345:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:355:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:406:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:456:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:468:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/colors/color.py:478:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/command/subcommands/file_output.py:222:9: D406 [*] Section name should end with a newline ("Raises")
- src/bokeh/core/has_props.py:459:9: D406 [*] Section name should end with a newline ("Returns")
- src/bokeh/core/has_props.py:462:9: D406 [*] Section name should end with a newline ("Examples")
- src/bokeh/core/has_props.py:529:9: D406 [*] Section name should end with a newline ("Returns")
... 1034 additional changes omitted for project

zulip/zulip (+0 -17 violations, +0 -0 fixes)

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

- zerver/data_import/slack.py:158:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:158:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:253:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:253:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:510:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:510:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:733:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:733:5: D407 [*] Missing dashed underline after section ("Returns")
- zerver/data_import/slack.py:876:5: D406 [*] Section name should end with a newline ("Returns")
- zerver/data_import/slack.py:876:5: D407 [*] Missing dashed underline after section ("Returns")
... 7 additional changes omitted for project

Changes by rule (2 rules affected)

code total + violation - violation + fix - fix
D407 983 0 983 0 0
D406 164 0 164 0 0

@AlexWaygood
Copy link
Member Author

The ecosystem hits look good to me, but it's a big change...

@AlexWaygood AlexWaygood marked this pull request as ready for review August 28, 2024 18:16
@charliermarsh
Copy link
Member

Can we quickly check which of those projects actually have D enabled, and which are being tested with ALL in the ecosystem CI?

@AlexWaygood
Copy link
Member Author

Can we quickly check which of those projects actually have D enabled, and which are being tested with ALL in the ecosystem CI?

@AlexWaygood AlexWaygood merged commit 281e6d9 into main Aug 29, 2024
20 checks passed
@AlexWaygood AlexWaygood deleted the alex/pydocstyle-convention branch August 29, 2024 15:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working docstring Related to docstring linting or formatting
Projects
None yet
Development

Successfully merging this pull request may close these issues.

D406 removes colons where D416 adds them
2 participants