Pianificazione di un programma di revisione del codice Python rivedere il follow-up

Nella terza parte di questa serie, hai visto come salvare le informazioni sulla richiesta di revisione del codice per il follow-up. Hai creato un metodo chiamato read_email per recuperare le e-mail dalla posta in arrivo per verificare se un revisore ha risposto alla richiesta di revisione del codice. Hai implementato anche la gestione degli errori nel codice dello scheduler di revisione del codice.

In questa parte della serie, utilizzerai le informazioni sulla revisione del codice salvate e le informazioni delle e-mail per verificare se il revisore ha risposto alla richiesta di revisione. Se a una richiesta non è stata data risposta, invierai un'email di follow-up al revisore.

Iniziare

Inizia clonando il codice sorgente dalla terza parte della serie di tutorial.

git clone https://github.com/royagasthyan/CodeReviewer-Part3 CodeReviewer

Modifica il config.json file per includere alcuni indirizzi e-mail pertinenti, mantenendo il file [email protected] indirizzo email. È perché git ha commit relativi a questo particolare indirizzo email che sono richiesti per l'esecuzione del codice come previsto. Modifica il SMTP credenziali nel schedule.py file:

FROM_EMAIL = "[email protected]" FROM_PWD = "tua_password"

Passare alla directory del progetto CodeReviewer e prova ad eseguire il seguente comando nel terminale.

python scheduler.py -n 20 -p "project_x"

Dovrebbe inviare la richiesta di revisione del codice agli sviluppatori casuali per la revisione e creare un reviewer.json file con informazioni di revisione.

Implementazione di una richiesta di follow-up

Iniziamo creando un metodo di richiesta di follow-up chiamato followup_request. Dentro il followup_request metodo, leggi il reviewer.json file e mantenere il contenuto in un elenco. Ecco come appare il codice:

con open ('reviewer.json', 'r') come jfile: review_info = json.load (jfile)

Quindi, inserire le informazioni e-mail utilizzando il read_email metodo che hai implementato nell'ultimo tutorial.

email_info = read_email (no_days)

Se il revisore ha risposto alla richiesta di revisione, dovrebbe esserci un'e-mail con lo stesso oggetto e a Ri: tag prefissato. Quindi, scorrere l'elenco delle informazioni sulla recensione e confrontare l'oggetto della recensione con l'oggetto dell'email per vedere se il revisore ha risposto alla richiesta.

per revisione in review_info: review_replied = false expected_subject = 'RE:' + review ['subject'] per email in email_info: if expected_subject == email ['subject']: review_replied = Stampa true 'L'autore ha risposto' break;

Come visto nel codice sopra, hai iterato attraverso il review_info elencare e controllare l'oggetto della recensione rispetto all'oggetto dell'email per vedere se il revisore ha risposto.

Ora, una volta che il revisore ha risposto alla richiesta di revisione del codice, non è necessario conservare le particolari informazioni di revisione nel reviewer.json file. Quindi creare un metodo Python chiamato Delete_Info rimuovere le informazioni di revisione particolare dal reviewer.json file. Ecco come Delete_Info sembra:

def Delete_Info (info, id): per i in xrange (len (informazioni)): if info [i] ['id'] == id: info.pop (i) interruzione informazioni di ritorno

Come visto nel codice sopra, hai ripetuto l'elenco delle informazioni sulla recensione e cancellato la voce che corrisponde all'Id. Dopo aver rimosso le informazioni dal file, restituire l'elenco.

Devi chiamare il Delete_Info metodo quando viene fornita una particolare informazione di revisione. Quando si chiama il Delete_Info metodo, è necessario passare una copia del review_info in modo che l'elenco delle informazioni originali non venga modificato. Avrai bisogno della lista di informazioni di revisione originale per il confronto più tardi. Quindi importa il copia Modulo Python per creare una copia dell'elenco di informazioni di revisione originale.

dalla copia copia di importazione

Crea una copia di review_info elenco.

review_info_copy = copia (review_info)

Quando si eliminano le informazioni di revisione a cui è stata data risposta dall'elenco originale, passare l'elenco delle copie al file Delete_Info metodo.

review_info_copy = Delete_Info (review_info_copy, review ['id'])

Ecco il followup_request metodo:

def followup_request (): con open ('reviewer.json', 'r') come jfile: review_info = json.load (jfile) review_info_copy = copia (review_info) email_info = read_email (no_days) per la revisione in review_info: review_replied = False expected_subject = 'Re:' + recensione ['oggetto'] per email in email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id ']) break;

Ora, una volta il review_info elenco è stato iterato, è necessario controllare se ci sono cambiamenti nel reviewer.json file. Se sono state rimosse tutte le informazioni di revisione esistenti, è necessario aggiornare il reviewer.json file in modo appropriato. Quindi controlla se review_info_copy e review_info sono uguali e aggiorna il reviewer.json file. 

se review_info_copy! = review_info: con open ('reviewer.json', 'w') come outfile: json.dump (review_info_copy, outfile)

Ecco il completo followup_request metodo:

def followup_request (): con open ('reviewer.json', 'r') come jfile: review_info = json.load (jfile) review_info_copy = copia (review_info) email_info = read_email (no_days) per la revisione in review_info: review_replied = False expected_subject = 'Re:' + recensione ['oggetto'] per email in email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id ']) break; se review_info_copy! = review_info: con open ('reviewer.json', 'w') come outfile: json.dump (review_info_copy, outfile)

Chiama il followup_request metodo per seguire le richieste di revisione che sono già state inviate.

try: commits = process_commits () # Aggiunto il metodo followup followup_request () if len (commit) == 0: print 'No commit found' else: schedule_review_request (commit) tranne Exception, e: print 'Si è verificato un errore. Controlla il registro per i dettagli. ' logger.error (str (datetime.datetime.now ()) + "- Errore:" + str (e) + "\ n") logger.exception (str (e)) 

Salva le modifiche precedenti. Per testare la funzionalità di follow-up, eliminare il reviewer.json file dalla directory del progetto. Ora esegui lo scheduler in modo che le richieste di revisione del codice vengano inviate agli sviluppatori casuali. Controlla se tali informazioni sono state salvate nel reviewer.json file.

Chiedere al particolare sviluppatore di rispondere alla richiesta di revisione del codice rispondendo all'e-mail. Ora eseguire di nuovo lo scheduler e questa volta il programma di pianificazione dovrebbe essere in grado di trovare la risposta e rimuoverla dal reviewer.json file.

Invio di email di promemoria

Una volta che il revisore ha risposto alle e-mail di richiesta di revisione del codice, tali informazioni devono essere rimosse dal reviewer.json file poiché non è necessario rintracciarlo ulteriormente. Se il revisore non ha ancora risposto alla richiesta di revisione del codice, è necessario inviare una mail di follow-up per ricordargli la richiesta di revisione.

Lo scheduler di revisione del codice dovrebbe essere eseguito su base giornaliera. Quando viene eseguito, per prima cosa è necessario verificare se è trascorso un certo periodo di tempo poiché lo sviluppatore ha risposto alla richiesta di revisione. Nella configurazione del progetto, è possibile impostare un periodo di revisione durante il quale, se il revisore non ha risposto, lo scheduler invierà un'e-mail di sollecito.

Iniziamo aggiungendo una configurazione nella configurazione del progetto. Aggiungi una nuova configurazione chiamata followup_frequency nel file di configurazione.

"nome": "project_x", "git_url": "https://github.com/royagasthyan/project_x", "followup_frequency": 2, "membri": ["[email protected]", "samon @ gmail .com "," [email protected] "," [email protected] "]

Quindi, quando il revisore non ha risposto per followup_frequency numero di giorni, invierai un'email di promemoria. Leggi la configurazione in una variabile globale durante la lettura delle configurazioni:

per p in main_config: if p ['name'] == progetto: project_url = p ['git_url'] project_members = p ['members'] followup_frequency = p ['followup_frequency'] break

Dentro il followup_request metodo, inviare un'e-mail di promemoria quando il revisore non ha risposto alle richieste di follow-up per followup_frequency numero di giorni. Calcola il numero di giorni dall'invio della revisione.

review_date = datetime.datetime.strptime (recensione ['sendDate'], '% Y-% m-% d') today = datetime.datetime.today () days_since_review = (today - review_date) .days

Se il numero di giorni è maggiore della data di frequenza di follow-up nelle configurazioni, inviare l'e-mail di promemoria.

se non review_replied: if days_since_review> followup_frequency: send_email (recensione ['reviewer'], 'Promemoria:' + recensione ['oggetto'], '\ nNon hai risposto alla richiesta di revisione \ n')

Ecco il completo followup_request metodo:

def followup_request (): con open ('reviewer.json', 'r') come jfile: review_info = json.load (jfile) review_info_copy = copia (review_info) email_info = read_email (no_days) per la revisione in review_info: review_date = datetime. datetime.strptime (recensione ['sendDate'], '% Y-% m-% d') today = datetime.datetime.today () days_since_review = (today - review_date) .days review_replied = False expected_subject = 'Re:' + rivedere ['subject'] per email in email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id']) break; if not review_replied: if days_since_review> followup_frequency: send_email (recensione ['revisore'], 'Promemoria:' + recensione ['oggetto'], '\ nNon hai risposto alla richiesta di revisione \ n') se review_info_copy! = review_info: con open ('reviewer.json', 'w') come outfile: json.dump (review_info_copy, outfile)

Avvolgendolo

In questo tutorial, hai visto come implementare la logica per seguire le richieste di revisione del codice. Hai anche aggiunto la funzionalità per inviare un'e-mail di promemoria se il revisore non ha risposto all'e-mail per un certo numero di giorni. 

Questo revisore di codice Python può essere ulteriormente migliorato per soddisfare le tue esigenze. Distribuisci il repository e aggiungi nuove funzionalità e faccelo sapere nei commenti seguenti.

Il codice sorgente di questo tutorial è disponibile su GitHub.