actual = self.get_suggestion(cls(), 'bluch')
self.assertIn(suggestion, actual)
+ def test_getattr_suggestions_underscored(self):
+ class A:
+ bluch = None
+
+ self.assertIn("'bluch'", self.get_suggestion(A(), 'blach'))
+ self.assertIn("'bluch'", self.get_suggestion(A(), '_luch'))
+ self.assertIn("'bluch'", self.get_suggestion(A(), '_bluch'))
+
+ class B:
+ _bluch = None
+ def method(self, name):
+ getattr(self, name)
+
+ self.assertIn("'_bluch'", self.get_suggestion(B(), '_blach'))
+ self.assertIn("'_bluch'", self.get_suggestion(B(), '_luch'))
+ self.assertNotIn("'_bluch'", self.get_suggestion(B(), 'bluch'))
+
+ self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, '_blach')))
+ self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, '_luch')))
+ self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, 'bluch')))
+
def test_getattr_suggestions_do_not_trigger_for_long_attributes(self):
class A:
blech = None
actual = self.get_import_from_suggestion(code, 'bluch')
self.assertIn(suggestion, actual)
+ def test_import_from_suggestions_underscored(self):
+ code = "bluch = None"
+ self.assertIn("'bluch'", self.get_import_from_suggestion(code, 'blach'))
+ self.assertIn("'bluch'", self.get_import_from_suggestion(code, '_luch'))
+ self.assertIn("'bluch'", self.get_import_from_suggestion(code, '_bluch'))
+
+ code = "_bluch = None"
+ self.assertIn("'_bluch'", self.get_import_from_suggestion(code, '_blach'))
+ self.assertIn("'_bluch'", self.get_import_from_suggestion(code, '_luch'))
+ self.assertNotIn("'_bluch'", self.get_import_from_suggestion(code, 'bluch'))
+
def test_import_from_suggestions_do_not_trigger_for_long_attributes(self):
code = "blech = None"
obj = exc_value.obj
try:
d = dir(obj)
+ hide_underscored = (wrong_name[:1] != '_')
+ if hide_underscored and tb is not None:
+ while tb.tb_next is not None:
+ tb = tb.tb_next
+ frame = tb.tb_frame
+ if 'self' in frame.f_locals and frame.f_locals['self'] is obj:
+ hide_underscored = False
+ if hide_underscored:
+ d = [x for x in d if x[:1] != '_']
except Exception:
return None
elif isinstance(exc_value, ImportError):
try:
mod = __import__(exc_value.name)
d = dir(mod)
+ if wrong_name[:1] != '_':
+ d = [x for x in d if x[:1] != '_']
except Exception:
return None
else: