Codemod è una libreria concepita con lo scopo di fornire uno strumento che assista lo sviluppatore in procedure che prevedono il refactoring di codebase di grandi dimensioni; l'obbiettivo è in sostanza quello di permettere la modifica, l'aggiornamento o la correzione di porzioni di sorgente anche particolarmente estese mantenendo inalterate le funzionalità di base di un'applicazione.
Codemod è una soluzione realizzata all'interno dei laboratori di Facebook e presenta un approccio improntato all'automatizzazione dei processi, in linea generale esso dovrebbe rivelarsi particolarmente adatto a tutti quei progetti per i quali il code refactoring può essere parzialmente automatizzato pur richiedendo una supervisione tecnica da parte dei developer e occasionali interventi manuali.
Rilasciata sotto licenza Open Source, la libreria è stata implementata in linguaggio Python e può essere installata adottando il package manager system pip (Python Package Index):
# in ambiente virtuale o una volta impersonato l'admin
pip install codemod
# nel proprio sistema tramite sudo
sudo -H pip install codemod
L'automatizzazione del refactoring in Codemod si basa sostanzialmente sull'impiego di espressioni regolari. Un esempio particolarmente interessante potrebbe essere quello che prevede la sostituzione di un costrutto deprecato: nel codice seguente vengono definiti dei pattern per l'individuazione del tag font
, quando esso viene utilizzato per la colorazione del testo attraverso l'attributo color, per poi inserire al suo posto una semplice regola CSS:
codemod -m -d /home/jrosenstein/www --extensions php,html \
'(.*?)' \
'\2'
Ogni volta verrà rilevata una corrispondenza in fase di esecuzione Codemod provvederà a segnalarla, lo sviluppatore potrà quindi accettare la sostituzione prevista, rifiutarla o intervenire direttamente sulla riga di codice evidenziata per modificarla personalmente tramite editor.
I parametri previsti sono quindi un pattern per l'individuazione e una stringa sostitutiva; nel caso in cui dovesse essere necessaria quest'ultima potrà essere omessa, la libreria si occuperà quindi della sola fase di rilevazione e il developer potrà decidere di volta in volta quali interventi effettuare per tutte le corrispondenze individuate.
Via Codemod