Rename Method refactoring allowed for methods designed for numeric type emulation
researcher175 opened this issue · 0 comments
researcher175 commented
Rename Method refactoring is allowed to change the name of methods designed to emulate numeric operations.
It would be nice if Rope sent an alert, as this transformation may cause type errors regarding unsupported operands.
Steps to reproduce the behavior:
- Code before refactoring:
structure
-- main
---- blob.py
-- test
---- test.py
blob.py:
class BaseBlob(object):
def __init__(self, text):
self.raw = text
def _cmpkey(self):
return self.raw
def _compare(self, other, method):
try:
return method(self._cmpkey(), other._cmpkey())
except (AttributeError, TypeError):
return NotImplemented
def __eq__(self, other):
return self._compare(other, lambda s, o: s == o)
def __add__(self, other):
if isinstance(other, (str, bytes)):
return self.__class__(self.raw + other)
elif isinstance(other, BaseBlob):
return self.__class__(self.raw + other.raw)
else:
raise TypeError('Operands must be either strings or {0} objects'
.format(self.__class__.__name__))
class TextBlob(BaseBlob):
pass
test.py:
from unittest import TestCase, main
from main import blob as tb
class TextBlobTest(TestCase):
def test_add(self):
blob1 = tb.TextBlob('Hello, world! ')
blob2 = tb.TextBlob('Hola mundo!')
self.assertEqual(blob1 + blob2, tb.TextBlob('Hello, world! Hola mundo!'))
self.assertEqual(blob1 + 'Hola mundo!', tb.TextBlob('Hello, world! Hola mundo!'))
self.assertEqual(blob1 + blob2 + ' Goodbye!', tb.TextBlob('Hello, world! Hola mundo! Goodbye!'))
self.assertRaises(TypeError, blob1.__add__, ['hello'])
- Apply the Rename Method refactoring with the new name 'extractor' to 'BaseBlob.__add__'