python-rope/rope

Rename Method refactoring allowed for methods designed for numeric type emulation

researcher175 opened this issue · 0 comments

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:

  1. 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'])
  1. Apply the Rename Method refactoring with the new name 'extractor' to 'BaseBlob.__add__'