-
-
Notifications
You must be signed in to change notification settings - Fork 8
ENH: Add formatters for numpydoc section ordering and name/type spacing #132
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
Merged
DanielNoord
merged 2 commits into
DanielNoord:main
from
DWesl:numpydoc-simple-reformatting
Aug 21, 2022
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
131 changes: 131 additions & 0 deletions
131
pydocstringformatter/_formatting/formatters_numpydoc.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| from __future__ import annotations | ||
|
|
||
| from collections import OrderedDict | ||
|
|
||
| from pydocstringformatter._formatting.base import NumpydocSectionFormatter | ||
|
|
||
|
|
||
| class NumpydocSectionOrderingFormatter(NumpydocSectionFormatter): | ||
| """Change section order to match numpydoc guidelines.""" | ||
|
|
||
| name = "numpydoc-section-order" | ||
|
|
||
| numpydoc_section_order = ( | ||
| "Summary", | ||
| "Parameters", | ||
| "Attributes", | ||
| "Methods", | ||
| "Returns", | ||
| "Yields", | ||
| "Receives", | ||
| "Other Parameters", | ||
| "Raises", | ||
| "Warns", | ||
| "Warnings", | ||
| "See Also", | ||
| "Notes", | ||
| "References", | ||
| "Examples", | ||
| ) | ||
|
|
||
| def treat_sections( | ||
| self, sections: OrderedDict[str, list[str]] | ||
| ) -> OrderedDict[str, list[str]]: | ||
| """Sort the numpydoc sections into the numpydoc order.""" | ||
| for sec_name in reversed(self.numpydoc_section_order): | ||
| try: | ||
| sections.move_to_end(sec_name, last=False) | ||
| except KeyError: | ||
| pass | ||
| return sections | ||
|
|
||
|
|
||
| class NumpydocNameColonTypeFormatter(NumpydocSectionFormatter): | ||
| """Ensure proper spacing around the colon separating names from types.""" | ||
|
|
||
| name = "numpydoc-name-type-spacing" | ||
|
|
||
| numpydoc_sections_with_parameters = ( | ||
| "Parameters", | ||
| "Attributes", | ||
| "Returns", | ||
| "Yields", | ||
| "Receives", | ||
| "Other Parameters", | ||
| "See Also", | ||
| ) | ||
|
|
||
| def treat_sections( | ||
| self, sections: OrderedDict[str, list[str]] | ||
| ) -> OrderedDict[str, list[str]]: | ||
| """Ensure proper spacing around the colon separating names from types.""" | ||
| for section_name, section_lines in sections.items(): | ||
DanielNoord marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| if section_name in self.numpydoc_sections_with_parameters: | ||
| # Any section that gets here has a line of hyphens | ||
| initial_indent = section_lines[1].index("-") | ||
| for index, line in enumerate(section_lines): | ||
| if ( | ||
| # There is content on this line (at least the initial indent) | ||
| len(line) > initial_indent | ||
| # and the first character after the indent for | ||
| # the docstring is a name, not an additional | ||
| # indent indicating a description rather than | ||
| # a line with name and type | ||
| and not line[initial_indent].isspace() | ||
DanielNoord marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| # and there is a colon to separate the name | ||
| # from the type (functions returning only one | ||
| # thing don't put a name in their "Returns" | ||
| # section) | ||
| and ":" in line | ||
| ): | ||
| line_name, line_type = line.split(":", 1) | ||
| if line_type: | ||
| # Avoid adding trailing whitespace | ||
| # Colon ending first line is suggested for long | ||
| # "See Also" links | ||
| section_lines[ | ||
| index | ||
| ] = f"{line_name.rstrip():s} : {line_type.lstrip():s}" | ||
| return sections | ||
|
|
||
|
|
||
| class NumpydocSectionSpacingFormatter(NumpydocSectionFormatter): | ||
| """Ensure proper spacing between sections.""" | ||
|
|
||
| name = "numpydoc-section-spacing" | ||
|
|
||
| def treat_sections( | ||
| self, sections: OrderedDict[str, list[str]] | ||
| ) -> OrderedDict[str, list[str]]: | ||
| """Ensure proper spacing between sections.""" | ||
| for section_lines in sections.values(): | ||
| last_line = section_lines[-1] | ||
| if not (last_line == "" or last_line.isspace()): | ||
| section_lines.append("") | ||
| return sections | ||
|
|
||
|
|
||
| class NumpydocSectionHyphenLengthFormatter(NumpydocSectionFormatter): | ||
| """Ensure hyphens after section header lines are proper length.""" | ||
|
|
||
| name = "numpydoc-section-hyphen-length" | ||
|
|
||
| def treat_sections( | ||
| self, sections: OrderedDict[str, list[str]] | ||
| ) -> OrderedDict[str, list[str]]: | ||
| """Ensure section header lines are proper length.""" | ||
| first_section = True | ||
| for section_name, section_lines in sections.items(): | ||
DanielNoord marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| if section_name != "Summary": | ||
| # Skip the summary, deprecation warning and extended | ||
| # summary. They have neither a section header nor the | ||
| # line of hyphens after it. | ||
| indent_length = section_lines[1].index("-") | ||
| section_lines[1] = " " * indent_length + "-" * len(section_name) | ||
| if first_section: | ||
| # If the second line were not hyphens, the section name | ||
| # would be summary. This assumes triple quotes, but that | ||
| # seems fine for a multi-line docstring. | ||
| section_lines[1] = f"{section_lines[1]:s}---" | ||
| first_section = False | ||
| return sections | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| --style=numpydoc | ||
| --no-numpydoc-name-type-spacing | ||
| --no-numpydoc-section-order | ||
| --no-numpydoc-section-spacing | ||
| --no-final-period | ||
| --no-closing-quotes |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| numpydoc_style.py |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| """Example module for numpydoc docstring style. | ||
| References | ||
| ---------- | ||
| NumPy docstring style guide: | ||
| https://numpydoc.readthedocs.io/en/latest/format.html#documenting-modules""" | ||
| import math | ||
|
|
||
| EULER_NUMBER = math.e | ||
| """Euler's number. | ||
|
|
||
| Not related to Euler's constant (sometimes called the Euler-Mascheroni | ||
| constant. | ||
| References | ||
| ---------- | ||
| E (mathematical constant) | ||
| https://en.wikipedia.org/wiki/E_(mathematical_constant) | ||
| Notes | ||
| ----- | ||
| It is the limit of ``(1 + 1/n)**n`` as n approaches infinity, so it | ||
| is used in the equation for continuously-compouned interest. | ||
|
|
||
| It is also the sum of the reciprocals of the whole numbers starting | ||
| with zero, which is related to some calculus-related properties | ||
| mathemeticians find elegant. | ||
| """ | ||
|
|
||
|
|
||
| def sincos(theta): | ||
| """Returns | ||
| ---------- | ||
| sin: float | ||
| the sine of theta | ||
| cos: float | ||
| the cosine of theta | ||
| Raises | ||
| ------ | ||
| TypeError | ||
| If `theta` is not a float. | ||
| Parameters | ||
| ---------- | ||
| theta: float | ||
| the angle at which to calculate the sine and cosine. | ||
| """ | ||
| return math.sin(theta), math.cos(theta) | ||
|
|
||
|
|
||
| def fibbonacci(): | ||
| """Generate the Fibonacci sequence. | ||
|
|
||
| Each term is the sum of the two previous; conventionally starts | ||
| with two ones. | ||
| References | ||
| ---------- | ||
| Fibonacci numbers | ||
| https://en.wikipedia.org/wiki/Fibonacci_number | ||
| Yields | ||
| ------ | ||
| int""" | ||
| curr = 1 | ||
| last = 0 | ||
| while True: | ||
| yield curr | ||
| curr, last = curr + last, curr |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.