Skip to content

Commit 90babc9

Browse files
committed
fix docstrings validation
1 parent 9b15cd3 commit 90babc9

File tree

6 files changed

+63
-9
lines changed

6 files changed

+63
-9
lines changed

advanced_descriptors/separate_class_method.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ def __objclass__(self) -> typing.Optional[type]: # pragma: no cover
152152
"""Read-only owner.
153153
154154
:return: property owner class
155-
:rtype: typing.Optional[type]"""
155+
:rtype: typing.Optional[type]
156+
"""
156157
return self.__owner
157158

158159
@property

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ exclude =
3434
*egg,
3535
build,
3636
__init__.py,
37+
_version.py,
3738
docs
3839
ignore =
3940
E203,

setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ def get_simple_vars_from_src(
149149
* Executable code, including string formatting and comprehensions.
150150
151151
Examples:
152-
153152
>>> string_sample = "a = '1'"
154153
>>> get_simple_vars_from_src(string_sample)
155154
{'a': '1'}

test/test_advanced_property.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
# pylint: skip-file
22

3+
"""Tests for AdvancedProperty."""
4+
35
import unittest
46

57
import advanced_descriptors
68

79

810
class TestAdvancedProperty(unittest.TestCase):
11+
"""Main tests for AdvancedProperty."""
12+
913
def test_01_normal_property(self):
14+
"""Test work like normal property."""
15+
1016
class Target:
1117
def __init__(tself):
1218
tself._value = 42
@@ -33,6 +39,8 @@ def val(tself):
3339
getattr(Target, "val") # noqa: B009
3440

3541
def test_02_full(self):
42+
"""Test all getters + setter + deleter implemented."""
43+
3644
class Target:
3745
_value = 777
3846

@@ -67,6 +75,8 @@ def val(cls):
6775
self.assertEqual(Target.val, 777)
6876

6977
def test_03_class_wide_only(self):
78+
"""Test class wide getter is implemented, while instance not."""
79+
7080
class Target:
7181
getcls = advanced_descriptors.AdvancedProperty()
7282

@@ -78,6 +88,8 @@ def getcls(cls):
7888
self.assertIs(Target, Target().getcls)
7989

8090
def test_04_no_methods(self):
91+
"""Test no any methods implemented."""
92+
8193
class Target:
8294
prop = advanced_descriptors.AdvancedProperty()
8395

@@ -94,6 +106,8 @@ class Target:
94106
del Target().prop
95107

96108
def test_05_methods_access(self):
109+
"""Test access to original methods."""
110+
97111
def getter(inst):
98112
return inst._value
99113

test/test_log_on_access.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# pylint: skip-file
22

3+
"""Tests for LogOnAccess descriptor."""
4+
35
import io
46
import logging
57
import unittest
@@ -8,22 +10,28 @@
810

911

1012
class TestLogOnAccess(unittest.TestCase):
13+
"""Main tests for LogOnAccess descriptor."""
14+
1115
def setUp(self):
16+
"""Initialize specific logger for tests."""
1217
self.stream = io.StringIO()
1318
logging.getLogger().handlers.clear()
1419
logging.basicConfig(level=logging.DEBUG, stream=self.stream)
1520

1621
def tearDown(self):
22+
"""Close test logger."""
1723
logging.getLogger().handlers.clear()
1824
self.stream.close()
1925

2026
def test_01_positive(self):
27+
"""Test positive scenario."""
28+
2129
class Target:
2230
def __init__(self, val="ok"):
2331
self.val = val
2432

2533
def __repr__(self):
26-
return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)
34+
return f"{self.__class__.__name__}(val={self.val})"
2735

2836
@advanced_descriptors.LogOnAccess
2937
def ok(self):
@@ -56,6 +64,8 @@ def ok(self):
5664
self.assertEqual(self.stream.getvalue(), "DEBUG:advanced_descriptors.log_on_access:del Target(val=OK).ok\n")
5765

5866
def test_02_positive_properties(self):
67+
"""Test positive scenario with non standard settings."""
68+
5969
class Target:
6070
def __init__(self, val="ok"):
6171
self.val = val
@@ -76,10 +86,12 @@ def ok(self):
7686
self.assertEqual(target.ok, "ok")
7787
self.assertEqual(
7888
self.stream.getvalue(),
79-
"INFO:advanced_descriptors.log_on_access:<Target() at 0x{id:X}>.override -> 'ok'\n".format(id=id(target)),
89+
f"INFO:advanced_descriptors.log_on_access:<Target() at 0x{id(target):X}>.override -> 'ok'\n",
8090
)
8191

8292
def test_03_positive_no_log(self):
93+
"""Test log_success flag."""
94+
8395
class Target:
8496
def __init__(self, val="ok"):
8597
self.val = val
@@ -99,9 +111,11 @@ def ok(self):
99111
self.assertEqual(self.stream.getvalue(), "")
100112

101113
def test_04_negative(self):
114+
"""Test basic negative scenario."""
115+
102116
class Target:
103117
def __repr__(self):
104-
return "{cls}()".format(cls=self.__class__.__name__)
118+
return f"{self.__class__.__name__}()"
105119

106120
@advanced_descriptors.LogOnAccess
107121
def ok(self):
@@ -147,6 +161,8 @@ def ok(self):
147161
)
148162

149163
def test_05_negative_properties(self):
164+
"""Test negative scenario with non standard settings."""
165+
150166
class Target:
151167
def __init__(self, val="ok"):
152168
self.val = val
@@ -170,11 +186,13 @@ def ok(self):
170186

171187
self.assertEqual(
172188
self.stream.getvalue().splitlines()[0],
173-
"ERROR:advanced_descriptors.log_on_access:Failed: <Target() at 0x{id:X}>.override".format(id=id(target)),
189+
f"ERROR:advanced_descriptors.log_on_access:Failed: <Target() at 0x{id(target):X}>.override",
174190
)
175191
self.assertEqual(len(self.stream.getvalue().splitlines()), 1)
176192

177193
def test_06_negative_no_log(self):
194+
"""Test log_failure flag."""
195+
178196
class Target:
179197
def __init__(self, val="ok"):
180198
self.val = val
@@ -196,9 +214,11 @@ def ok(self):
196214
self.assertEqual(self.stream.getvalue(), "")
197215

198216
def test_07_property_mimic(self):
217+
"""Test property API not broken."""
218+
199219
class Target:
200220
def __repr__(self):
201-
return "{}()".format(self.__class__.__name__)
221+
return f"{self.__class__.__name__}()"
202222

203223
empty = advanced_descriptors.LogOnAccess(doc="empty_property")
204224

@@ -216,6 +236,8 @@ def __repr__(self):
216236
self.assertEqual(self.stream.getvalue(), "")
217237

218238
def test_08_logger(self):
239+
"""Test with logger enforced."""
240+
219241
class Target:
220242
on_init_set = advanced_descriptors.LogOnAccess(
221243
logger=logging.getLogger("on_init_set"), fget=lambda self: "on_init_set"
@@ -235,7 +257,7 @@ def prop_name(self):
235257
prop_name.logger = "prop_name"
236258

237259
def __repr__(self):
238-
return "{}()".format(self.__class__.__name__)
260+
return f"{self.__class__.__name__}()"
239261

240262
target = Target()
241263

@@ -261,6 +283,8 @@ def __repr__(self):
261283
self.assertEqual(self.stream.getvalue(), "DEBUG:prop_name:Target().prop_name -> 'prop_name'\n")
262284

263285
def test_09_logger_implemented(self):
286+
"""Test with logger attribute available in target instance."""
287+
264288
class Target:
265289
def __init__(self, val="ok"):
266290
self.val = val
@@ -300,13 +324,15 @@ def ok(self):
300324
self.assertEqual(self.stream.getvalue(), "DEBUG:Target:del Target(val=OK).ok\n")
301325

302326
def test_10_log_implemented(self):
327+
"""Test with log attribute available in target instance."""
328+
303329
class Target:
304330
def __init__(self, val="ok"):
305331
self.val = val
306332
self.log = logging.getLogger(self.__class__.__name__)
307333

308334
def __repr__(self):
309-
return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)
335+
return f"{self.__class__.__name__}(val={self.val})"
310336

311337
@advanced_descriptors.LogOnAccess
312338
def ok(self):

test/test_separate_class_method.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
# pylint: skip-file
22

3+
"""Tests for SeparateClassMethod."""
4+
35
import unittest
46

57
import advanced_descriptors
68

79

810
class TestSeparateClassMethod(unittest.TestCase):
11+
"""Main tests for SeparateClassMethod."""
12+
913
def test_01_instance_method(self):
14+
"""Test instance method support with decorating in-place."""
15+
1016
class Target(object):
1117
def __init__(tself):
1218
tself.value = 42
@@ -21,6 +27,8 @@ def getval(tself):
2127
Target.getval()
2228

2329
def test_02_alt_instance_method(self):
30+
"""Test instance method support with late bind."""
31+
2432
class Target(object):
2533
def __init__(tself):
2634
tself.value = 42
@@ -37,6 +45,8 @@ def getval(tself):
3745
Target.getval()
3846

3947
def test_03_class_method(self):
48+
"""Test class method support."""
49+
4050
class Target(object):
4151
getcls = advanced_descriptors.SeparateClassMethod()
4252

@@ -48,6 +58,8 @@ def getcls(cls):
4858
self.assertIs(Target, Target().getcls())
4959

5060
def test_04_both(self):
61+
"""Test coexistency of class method and instance method."""
62+
5163
class Target(object):
5264
value = 1
5365

@@ -67,6 +79,7 @@ def getval(cls):
6779
self.assertEqual(Target.getval(), 1)
6880

6981
def test_05_functions_access(self):
82+
"""Test possibility to get original functions from decorator object."""
7083
def imeth(instance):
7184
return instance.value
7285

0 commit comments

Comments
 (0)