Construirea unui planificator de revizuire a codului Python revizuirea urmăririi

În cea de-a treia parte a acestei serii, ați văzut cum să salvați informațiile de solicitare de revizuire a codului pentru urmărire. Ați creat o metodă numită read_email pentru a prelua mesajele e-mail din căsuța de e-mail pentru a verifica dacă un comentator a răspuns la solicitarea de revizuire a codului. Ați implementat, de asemenea, gestionarea erorilor în codul de programare a codului de examinare.

În această parte a seriei, veți utiliza informațiile de revizuire a codului salvate și informațiile din e-mailuri pentru a verifica dacă recenzorul a răspuns la solicitarea de examinare. Dacă nu ați răspuns la o solicitare, veți trimite un e-mail de urmărire către recenzent.

Noțiuni de bază

Începeți prin clonarea codului sursă din a treia parte a seriei tutorial.

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

Modificați config.json fișier pentru a include unele adrese de e-mail relevante, păstrarea [email protected] adresa de email. Acest lucru se datorează faptului că git are angajamente legate de această adresă de e-mail specială, care sunt necesare pentru executarea codului conform așteptărilor. Modificați SMTP acreditări în schedule.py fişier:

FROM_EMAIL = "[email protected]" FROM_PWD = "parola dvs."

Navigați la directorul proiectului CodeReviewer și încercați să executați următoarea comandă în terminal.

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

Acesta ar trebui să trimită cererea de revizuire a codului pentru dezvoltatorii aleatorii pentru revizuire și să creeze o reviewer.json fișier cu informații de recenzie.

Implementarea unei solicitări de urmărire

Să începem prin crearea unei metode de solicitare de urmărire numită followup_request. În interiorul followup_request metoda, citiți reviewer.json fișier și păstrați conținutul într-o listă. Iată cum arată codul:

cu open ('reviewer.json', 'r') ca jfile: review_info = json.load (jfile)

Apoi, trageți informațiile despre e - mail folosind read_email metoda pe care ați implementat-o ​​în ultimul tutorial.

email_info = read_email (no_days)

Dacă recenzorul a răspuns la solicitarea de examinare, ar trebui să existe un e-mail cu același subiect și a Re: etichetă prefixată la acesta. Deci, iterați prin lista de informații de revizuire și comparați subiectul revizuirii cu subiectul e-mailului pentru a vedea dacă recenzorul a răspuns solicitării.

pentru revizuire în review_info: review_replied = false expected_subject = 'RE:' + revizuire ['subject'] pentru e-mail în email_info: if expected_subject == email ['subject']: review_replied = True print 'Referentul a răspuns' break;

După cum se vede în codul de mai sus, ați repetat prin review_info afișați și verificați subiectul mesajului de recenzie în fața subiectului de e-mail pentru a vedea dacă recenzorul a răspuns.

Acum, după ce evaluatorul a răspuns la solicitarea de revizuire a codului, nu este necesar să păstrați informațiile de revizuire specifice în reviewer.json fişier. Deci, creați o metodă Python numită delete_info pentru a elimina informațiile de revizuire de la reviewer.json fişier. Iată cum delete_info arată:

Definiți parametrul de ștergere (info, id): pentru i în xrange (len (info)): dacă info [i] ['id'] == id: info.pop

După cum se vede în codul de mai sus, ați reușit să treceți prin lista de informații de revizuire și ați șters intrarea care corespunde codului de identificare. După eliminarea informațiilor din fișier, returnați lista.

Trebuie să sunați delete_info atunci când se răspunde la o anumită informație de revizuire. Când sunați delete_info metodă, trebuie să transmiteți o copie a textului review_info astfel încât lista informativă originală să nu fie modificată. Veți avea nevoie de lista de informații despre recenziile originale pentru comparație mai târziu. Deci importă copie Modul Python pentru a crea o copie a listei de informații originale de revizuire.

din copia importului copiei

Creați o copie a fișierului review_info listă.

review_info_copy = copy (review_info)

Când ștergeți informațiile de recenzie la care a răspuns din lista originală, treceți lista de copiere la delete_info metodă.

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

Aici este followup_request metodă:

def followup_request (): cu open ('reviewer.json', 'r') ca jfile: review_info = json.load (jfile) review_info_copy = copy_control_info = email_info = read_email = 'Re:' + revizuire ['subiect'] pentru e-mail în email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id']) break;

Acum, odată review_info lista a fost repetată, trebuie să verificați dacă există modificări în reviewer.json fişier. Dacă au fost eliminate orice informații de recenzie existente, trebuie să le actualizați reviewer.json fișier corespunzător. Deci, verificați dacă review_info_copy și review_info sunt aceleași și actualizați reviewer.json fişier. 

dacă review_info_copy! = review_info: cu open ('reviewer.json', 'w') ca outfile: json.dump (review_info_copy, outfile)

Aici este completă followup_request metodă:

def followup_request (): cu open ('reviewer.json', 'r') ca jfile: review_info = json.load (jfile) review_info_copy = copy_control_info = email_info = read_email = 'Re:' + revizuire ['subiect'] pentru e-mail în email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id']) break; dacă review_info_copy! = review_info: cu open ('reviewer.json', 'w') ca outfile: json.dump (review_info_copy, outfile)

Apelați la followup_request metodă de urmărire a solicitărilor de revizuire care au fost deja trimise.

încercați: commits = process_commits () # A adăugat următoarea metodă followup_request () if len (commits) == 0: print 'Nu există comitete găsite altfel: schedule_review_request (commits) excepție Exception, e: print' Verificați jurnalul pentru detalii. " logger.error (str (datetime.datetime.now ()) + "- Eroare a apărut:" + str (e) + "\ n") logger.exception 

Salvați modificările de mai sus. Pentru a testa funcționalitatea de urmărire, ștergeți reviewer.json fișier din directorul de proiect. Acum rulați programatorul astfel încât cererile de revizuire a codului să fie trimise dezvoltatorilor aleatorii. Verificați dacă informațiile respective au fost salvate în reviewer.json fişier.

Cereți dezvoltatorului special să răspundă la solicitarea de revizuire a codului răspunzând la e-mail. Acum rulați din nou planificatorul și de această dată programul de programare ar trebui să găsească răspunsul și să îl elimine din reviewer.json fişier.

Trimiterea e-mailurilor de reamintire

Odată ce recenzentul a răspuns la e-mailurile de solicitare de revizuire a codului, aceste informații trebuie să fie eliminate din reviewer.json deoarece nu aveți nevoie să îl urmăriți mai departe. Dacă recenzentul nu a răspuns încă la solicitarea de examinare a codului, trebuie să trimiteți un e-mail de urmărire pentru a-i reaminti despre solicitarea de examinare.

Planificatorul de revizuire a codului ar funcționa zilnic. Când este rulat, trebuie mai întâi să verificați dacă a fost un anumit timp după ce dezvoltatorul a răspuns la solicitarea de revizuire. În configurația proiectului, puteți seta o perioadă de examinare în care, dacă recenzentul nu a răspuns, planificatorul va trimite un e-mail de reamintire.

Să începem prin adăugarea unei configurații în configurația de proiect. Adăugați o nouă configare numită followup_frequency în fișierul de configurare.

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

Deci, când recenzorul nu a răspuns followup_frequency numărul de zile, veți trimite un e-mail de memento. Citiți configurația într-o variabilă globală în timp ce citiți configurațiile:

pentru p în main_config: dacă p ['name'] == proiect: project_url = p ['git_url'] project_members = p ['members'] followup_frequency = p ['followup_frequency'

În interiorul followup_request , trimiteți un e-mail de reamintire atunci când recenzorul nu a răspuns la solicitările de urmărire followup_frequency număr de zile. Calculați numărul de zile de la trimiterea recenziei.

review_date = datetime.datetime.strptime (revizuire ['sendDate'], '% Y-% m-% d') astăzi = datetime.datetime.today () days_since_review = (astăzi - review_date).

Dacă numărul de zile este mai mare decât data frecvenței de urmărire în configurații, trimiteți e-mailul de memento.

dacă nu review_replied: if days_since_review> followup_frequency: send_email (revizuiți ['reviewer'], 'Reminder:' + review ['subject'], '\ nNu ați răspuns la solicitarea de recenzie \ n')

Aici este completă followup_request metodă:

def followup_request (): cu open ('reviewer.json', 'r') ca jfile: review_info = json.load (jfile) review_info_copy = copie (review_info) email_info = read_email (no_days) pentru review in review_info: review_date = datetime. datetime.strptime (revizuire ['sendDate'], '% Y-% m-% d') astăzi = datetime.datetime.today () days_since_review = (today - review_date) .days review_replied = recenzie ['subiect'] pentru e-mailul în email_info: if expected_subject == email ['Subject']: review_replied = True review_info_copy = Delete_Info (review_info_copy, review ['id']); dacă nu review_replied: if days_since_review> followup_frequency: send_email (revizuire ['reviewer'], 'Reminder:' + review ['subject'], '\ nDacă review_info_copy! = review_info: cu open ('reviewer.json', 'w') ca outfile: json.dump (review_info_copy, outfile)

Înfășurați-o

În acest tutorial, ați văzut cum să implementați logica pentru a urmări solicitările de revizuire a codului. De asemenea, ați adăugat funcționalitatea pentru a trimite un e-mail de reamintire dacă recenzentul nu a răspuns la e-mail pentru un anumit număr de zile. 

Acest reviewer de cod Python poate fi îmbunătățit în continuare pentru a vă satisface nevoile. Faceți furcă depozitul și adăugați funcții noi și anunțați-ne în comentariile de mai jos.

Codul sursă din acest tutorial este disponibil pe GitHub. 

Cod