Skip to content

Commit 9f9f21d

Browse files
authored
Merge pull request #83 from TimRepke/main
Fix handling of decorated classes
2 parents 55cfcad + 808c872 commit 9f9f21d

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

tap/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,11 @@ def tokenize_source(obj: object) -> Generator:
190190

191191
def get_class_column(obj: type) -> int:
192192
"""Determines the column number for class variables in a class."""
193+
first_line = 1
193194
for token_type, token, (start_line, start_column), (end_line, end_column), line in tokenize_source(obj):
194-
if start_line == 1 or token.strip() == '':
195+
if token.strip() == '@':
196+
first_line += 1
197+
if start_line <= first_line or token.strip() == '':
195198
continue
196199

197200
return start_column

tests/test_utils.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ def test_type_to_str(self) -> None:
137137
self.assertEqual(type_to_str(Union[List[int], Dict[float, bool]]), 'Union[List[int], Dict[float, bool]]')
138138

139139

140+
def class_decorator(cls):
141+
return cls
142+
143+
140144
class ClassColumnTests(TestCase):
141145
def test_column_simple(self):
142146
class SimpleColumn:
@@ -167,6 +171,23 @@ def func(self):
167171

168172
self.assertEqual(get_class_column(FuncColumn), 12)
169173

174+
def test_dataclass(self):
175+
@class_decorator
176+
class DataclassColumn:
177+
arg: int = 5
178+
self.assertEqual(get_class_column(DataclassColumn), 12)
179+
180+
def test_dataclass_method(self):
181+
def wrapper(f):
182+
pass
183+
184+
@class_decorator
185+
class DataclassColumn:
186+
@wrapper
187+
def func(self):
188+
pass
189+
self.assertEqual(get_class_column(DataclassColumn), 12)
190+
170191

171192
class ClassVariableTests(TestCase):
172193
def test_no_variables(self):
@@ -282,6 +303,14 @@ def f(self):
282303
class_variables['i'] = {'comment': ''}
283304
self.assertEqual(get_class_variables(FunctionsWithDocs), class_variables)
284305

306+
def test_dataclass(self):
307+
@class_decorator
308+
class DataclassColumn:
309+
arg: int = 5
310+
class_variables = OrderedDict()
311+
class_variables['arg'] = {'comment': ''}
312+
self.assertEqual(get_class_variables(DataclassColumn), class_variables)
313+
285314

286315
class GetLiteralsTests(TestCase):
287316
def test_get_literals_string(self) -> None:

0 commit comments

Comments
 (0)