I have my project structure as following
├── app │ ├── Country │ │ └── views.py │ ├── Customer │ │ └── views.py Where the module 'Country' folder is what I tried to rename it to 'Countries' and every occurrence it is used, and it is also imported in Customer/views.py as well.
from app.Country.views import * .... According to this tutorial Refactoring Python Applications for Simplicity, I tried it as below:
>>> from rope.base.project import Project >>> >>> proj = Project('app') >>> >>> Country = proj.get_folder('Country') >>> >>> from rope.refactor.rename import Rename >>> >>> change = Rename(proj, Country).get_changes('Countries') >>> proj.do(change) After executing the script, the module folder 'Country' was changed to 'Countries' but its instance where it is used in Customer/views.py does not change accordingly, the import statement in Customer/views.py is still
from app.Country.views import * I expected it should change to from app.Countries.views import * after refactoring, but it did not.
Is there anything else I should do to refactor this successfully? Thanks.
42 Answers
You could use proj.get_module('app.Country').get_resource() to rename module.
from rope.base.project import Project from rope.refactor.rename import Rename proj = Project('app') country = proj.get_module('app.Country').get_resource() change = Rename(proj, country).get_changes('Countries') print(change.get_description()) If you happen to work in a virtual environment and/or Django (as the views.py files suggest), you may need to define your PYTHONPATH variable before you start python.
>>> export PYTHONPATH=<path-to-app-folder>:<path-to-virtualen-bin>:<other-paths-used-by-your-project> >>> python Then (code from AnnieFromTaiwan is valid, as well as yours I guess, but did not test it):
from rope.base.project import Project from rope.refactor.rename import Rename proj = Project('app') country = proj.get_module('app.Country').get_resource() change = Rename(proj, country).get_changes('Countries') proj.do(change)