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

Fix another bug in class attr checking #133

Merged
merged 3 commits into from
Jun 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- Fixed
- Fixed a bug in unparsing annotations when checking class attributes
- Fixed a bug in checking class attributes where there are no attributes in
class def or in docstring

## [0.5.0] - 2024-06-22

Expand Down
18 changes: 13 additions & 5 deletions pydoclint/utils/visitor_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,22 @@ def checkClassAttributesAgainstClassDocstring(
) -> None:
"""Check class attribute list against the attribute list in docstring"""
classAttributes = _collectClassAttributes(node)

if len(classAttributes) == 0:
return

actualArgs: ArgList = _convertClassAttributesIntoArgList(classAttributes)

classDocstring: str = getDocstring(node)
doc: Doc = Doc(docstring=classDocstring, style=style)
try:
doc: Doc = Doc(docstring=classDocstring, style=style)
except Exception as excp:
doc = Doc(docstring='', style=style)
violations.append(
Violation(
code=1,
line=node.lineno,
msgPrefix=f'Class `{node.name}`:',
msgPostfix=str(excp).replace('\n', ' '),
)
)

docArgs: ArgList = doc.attrList

checkDocArgsLengthAgainstActualArgs(
Expand Down
21 changes: 21 additions & 0 deletions tests/data/google/class_attributes/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,24 @@ def do_something(self, arg2: bool) -> int:
int: Result
"""
return 2


class MyClass4:
"""
This is a class

Attributes:
name (str): My name
"""

def __int__(self):
pass


@dataclass
class MyClass5:
"""
This is a class
"""

morning: str
23 changes: 23 additions & 0 deletions tests/data/numpy/class_attributes/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,26 @@ def do_something(self, arg2: bool) -> int:
Result
"""
return 2


class MyClass4:
"""
This is a class

Attributes
----------
name : str
My name
"""

def __int__(self):
pass


@dataclass
class MyClass5:
"""
This is a class
"""

morning: str
2 changes: 1 addition & 1 deletion tests/data/sphinx/allow_init_docstring/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class E:
A class that does something

:attr attr1:
:attr attr1: Arg 2
:attr attr2: Arg 2
"""

def __init__(self, arg1: int, arg2: float) -> None:
Expand Down
21 changes: 21 additions & 0 deletions tests/data/sphinx/class_attributes/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,24 @@ def do_something(self, arg2: bool) -> int:
:rtype: int
"""
return 2


class MyClass4:
"""
This is a class

:attr name: My name
:type name: str
"""

def __int__(self):
pass


@dataclass
class MyClass5:
"""
This is a class
"""

morning: str
24 changes: 23 additions & 1 deletion tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,19 @@ def testClassAttributes(
'name: str].',
'DOC105: Method `MyClass3.do_something`: Argument names match, but type hints '
'in these args do not match: arg2',
'DOC602: Class `MyClass4`: Class docstring contains more class attributes '
'than in actual class attributes. ',
'DOC603: Class `MyClass4`: Class docstring attributes are different from '
'actual class attributes. (Or could be other formatting issues: '
'https://jsh9.github.io/pydoclint/violation_codes.html#notes-on-doc103 ). '
'Arguments in the docstring but not in the actual class attributes: [name: '
'str].',
'DOC601: Class `MyClass5`: Class docstring contains fewer class attributes '
'than actual class attributes. ',
'DOC603: Class `MyClass5`: Class docstring attributes are different from '
'actual class attributes. (Or could be other formatting issues: '
'https://jsh9.github.io/pydoclint/violation_codes.html#notes-on-doc103 ). '
'Attributes in the class definition but not in the docstring: [morning: str].',
],
False: [
'DOC105: Method `MyClass1.__init__`: Argument names match, but type hints in '
Expand Down Expand Up @@ -584,6 +597,13 @@ def testAllowInitDocstring(style: str) -> None:
'there are no "yield" statements, or the return annotation is not a '
'Generator/Iterator/Iterable. (Or it could be because the function lacks a '
'return annotation.) ',
'DOC602: Class `E`: Class docstring contains more class attributes than in '
'actual class attributes. ',
'DOC603: Class `E`: Class docstring attributes are different from actual '
'class attributes. (Or could be other formatting issues: '
'https://jsh9.github.io/pydoclint/violation_codes.html#notes-on-doc103 ). '
'Arguments in the docstring but not in the actual class attributes: [attr1: , '
'attr2: ].',
]
assert list(map(str, violations)) == expected

Expand Down Expand Up @@ -858,8 +878,10 @@ def testParsingErrors_google() -> None:
style='google',
)
expected = [
'DOC001: Class `A`: Potential formatting errors in docstring. Error message: '
"Expected a colon in 'arg1'.",
'DOC001: Function/method `__init__`: Potential formatting errors in '
"docstring. Error message: Expected a colon in 'arg1'."
"docstring. Error message: Expected a colon in 'arg1'.",
]
assert list(map(str, violations)) == expected

Expand Down
Loading