python-rope / rope

a python refactoring library
GNU Lesser General Public License v3.0
1.93k stars 162 forks source link

Rename Field refactoring allows you to rename a class field with class method names #765

Closed researcher175 closed 6 months ago

researcher175 commented 7 months ago

Rename Field refactoring allows you to rename a class field with class method names It would be nice if Rope sent an alert to the user to avoid call errors

Steps to reproduce the behavior:

  1. Code before refactoring:

structure

-- main ---- main.py -- test ---- test.py

main.py:

from abc import abstractmethod

class BaseNPExtractor(object):
    @abstractmethod
    def extract(self, text):
        return

class PatternTagger:
    def tag(self, text):
        return []

class ConllExtractor(BaseNPExtractor):
    POS_TAGGER = PatternTagger()

    def __init__(self, parser=None):
        self.parser = parser

    def extract(self, text):
        return []

    def _parse_sentence(self, sentence):
        tagged = self.POS_TAGGER.tag(sentence)
        return self.parser.parse(tagged)

test.py:

from __future__ import unicode_literals
import unittest
from main.main import ConllExtractor

class TestConllExtractor(unittest.TestCase):

    def setUp(self):
        self.extractor = ConllExtractor()
        self.text = 'Python is '

    def test_extract(self):
        noun_phrases = self.extractor.extract(self.text)
        self.assertTrue("Python" in noun_phrases)
  1. Apply the Rename Field refactoring with the new name 'extract' to the field 'ConllExtractor.POS_TAGGER'

After the transformation, the unit test will fail.

lieryan commented 6 months ago

Closing. Ticket merged into #779.