“Benvenuto Fixit 2!” ha annunciato Meta, rilasciando la versione più recente del suo linter open source per la correzione automatica. Questa nuova iterazione dell’linter è stata lanciata con l’obiettivo di potenziare l’efficienza e la competenza degli sviluppatori, sia nei progetti open source che in una vasta gamma di progetti all’interno del loro monorepo interno. Tutto ciò è entusiasmante, ma come si pone rispetto a Ruff, basato su Rust e lanciato agli inizi di quest’anno?
Amethyst Reese, responsabile del progetto e ingegnere principale di Fixit 2, ha chiarito su HN che si tratta di due linter differenti con scopi molto distinti. “Ruff dà la priorità alla velocità rispetto a tutte le altre considerazioni, utilizzando Rust per raggiungere questo obiettivo tramite regole lint generiche. Invece, Fixit si concentra su rendere semplice agli sviluppatori Python creare regole lint personalizzate”, ha aggiunto.
Inoltre, ha sottolineato che l’utilizzo di LibCST, che ha un parser scritto in Rust, semplifica la creazione di regole lint in Python. Ha sottolineato che Fixit consente agli ingegneri di definire regole lint specifiche all’interno dei loro repository di progetti con sforzi minimi, consentendo una rapida attivazione senza la necessità di creare plugin o pacchetti personalizzati, e senza richiedere una nuova iterazione di Fixit. “Questo abbassa le barriere alla creazione di regole e offre un rapido ciclo di sviluppo e feedback durante le fasi di test”, ha spiegato.
Inoltre, ha aggiunto che grazie alla configurazione gerarchica, Fixit è in grado di adattarsi bene a monorepo più ampi, permettendo a ciascun team di controllare facilmente quali regole lint vengono applicate sulla loro base di codice. “Anche i progetti open source ospitati in questi monorepo dispongono di strumenti per garantire che i risultati siano coerenti sia quando eseguiti su sistemi CI interni che esterni”, ha puntualizzato.
L’linter di correzione automatica, Fixit, è nato come strumento interno a Instagram, ma successivamente è stato rilasciato come progetto open source. Tuttavia, aveva alcune limitazioni, come l’incapacità di accogliere regole lint locali o una configurazione gerarchica, caratteristiche fondamentali per un monorepo che ospitava molti progetti. Le richieste degli sviluppatori di integrare Fixit nel monorepo sono state numerose, ma si sono incontrate con diverse sfide, portando solo a un supporto parziale per un insieme limitato di regole lint di sicurezza. Ciò ha ridotto l’efficacia potenziale di Fixit nella base di codice Python.
Affrontando il panorama di AI/ML, Meta ha intrapreso una riscrittura parziale di Fixit, con un’enfasi particolare sull’approccio open source. La nuova versione, Fixit 2, soddisfa le esigenze sia dei monorepo interni che dei progetti open source. Inoltre, ha introdotto il supporto per regole lint locali all’interno del repository, simili a quelle di Flake8, oltre a un’interfaccia a riga di comando (CLI) più sofisticata e un’API migliorata per una facile integrazione con altre strumenti e processi automatizzati. Fixit 2 elimina il rischio di generare sintassi errate, suggerendo e applicando correzioni automatiche basate sulle regole lint stesse, migliorando così l’efficacia e l’accuratezza nell’ottimizzazione del codice.
La creazione di nuove regole lint richiede solo poche righe di codice, spesso meno di dodici, insieme alla definizione dei casi di test direttamente nelle linee di codice. Questo offre una flessibilità ulteriore, poiché le regole possono essere posizionate vicino al codice che intendono valutare, rendendo il processo più agevole.
Python occupa un posto di rilievo in Meta come uno dei linguaggi di programmazione più ampiamente utilizzati. L’azienda riconosce i vantaggi di Python, tra cui la sintassi user-friendly e una vasta raccolta di librerie open source che forniscono funzionalità pronte all’uso.
Nel panorama degli linter per Python, esistono diverse opzioni efficaci. In Meta, Flake8 è stato utilizzato con successo dal 2016, aiutando gli sviluppatori a individuare errori e mantenere una struttura coerente nel codice. Tuttavia, Flake8 ha alcune limitazioni: la creazione di nuove regole lint richiede la creazione di plugin completi, che possono diventare complessi per risolvere più tipi di errori. Inoltre, quando segnala errori, Flake8 fornisce solo informazioni sulla posizione degli errori, senza suggerire correzioni. Ciò comporta un processo di prova ed errore per adeguarsi agli standard di linting. Inoltre, Flake8 dipende dal modulo stdlib ast, il che può rallentare l’adozione delle nuove funzionalità sintattiche.
Nel discutere di Fixit 2, Meta non ha menzionato dettagli specifici sulla velocità rispetto ad altri linter. Ruff, scritto in Rust, è noto per la sua velocità, superando in velocità altri linter basati su Python. Ruff è circa 150 volte più veloce di Flake8 su macOS e supera Pycodestyle di 75 volte, insieme a Pyflakes e Pylint di 50 volte, tra gli altri. La velocità di elaborazione di Ruff è di circa 60 millisecondi per un singolo file in CPython, rendendolo notevolmente rapido.