Rename Method refactoring does not rename all implementations of an abstract method

Ouverte
#774 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 7 jours

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
python
Domaine
devtools

Piste de recherche

Start from the reproduction in the issue: a base.py with abstract BaseTokenizer.tokenize, its WordTokenizer override, and the BaseBlob.tokens call site. Apply Rename Method to the abstract method and check which overrides and call sites are missed. Done means the reproduction's expected output is reached, with overrides and calls renamed together and test.py still valid. The payload names no rope source files, so locate the rename logic yourself.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug rename-refactor

Steps to reproduce the behavior:

  1. Code before refactoring:

structure

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

base.py:

from abc import abstractmethod, ABC


class BaseTokenizer(ABC):
    @abstractmethod
    def tokenize(self, text):
        return

    def itokenize(self, text, *args, **kwargs):
        return (t for t in self.tokenize(text, *args, **kwargs))


class WordTokenizer(BaseTokenizer):
    def tokenize(self, text, include_punc=True):
        return []


class BaseBlob(object):
    tokenizer = WordTokenizer()

    def __init__(self, text):
        self.raw = self.string = text

    def tokens(self):
        return list(self.tokenizer.tokenize(self.raw))


class TextBlob(BaseBlob):
    pass

test.py:

from unittest import TestCase, main
from main import base as tb
from main.base import WordTokenizer

class TextBlobTest(TestCase):

    def setUp(self):
        self.text = 'Explicit is better than implicit.'
        self.blob = tb.TextBlob(self.text)

    def test_tokens_property(self):
        self.assertTrue(self.blob.tokens, list(WordTokenizer().tokenize(self.text)))

  1. Apply the Rename Method refactoring with the new name 'continuous' to the method 'BaseTokenizer.tokenize'

  2. Expected code after refactoring:

structure:

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

base.py:

from abc import abstractmethod, ABC


class BaseTokenizer(ABC):
    @abstractmethod
    def CONTINUOUS(self, text):
        return

    def itokenize(self, text, *args, **kwargs):
        return (t for t in self.CONTINUOUS(text, *args, **kwargs))


class WordTokenizer(BaseTokenizer):
    def CONTINUOUS(self, text, include_punc=True):
        return []


class BaseBlob(object):
    tokenizer = WordTokenizer()

    def __init__(self, text):
        self.raw = self.string = text

    def tokens(self):
        return list(self.tokenizer.CONTINUOUS(self.raw))


class TextBlob(BaseBlob):
    pass

test.py:

from unittest import TestCase, main
from main import base as tb
from main.base import WordTokenizer

class TextBlobTest(TestCase):

    def setUp(self):
        self.text = 'Explicit is better than implicit.'
        self.blob = tb.TextBlob(self.text)

    def test_tokens_property(self):
        self.assertTrue(self.blob.tokens, list(WordTokenizer().CONTINUOUS(self.text)))

Langage dominant
Python
Étoiles
2.2k
Forks
197
Merge moyen
2 j 13 h
PR mergées (30 j)
5

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de python-rope/rope

Toutes les issues de python-rope/rope

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.