Construirea unui Planificator de revizuire a codului Python păstrarea informațiilor de examinare

În cea de-a doua parte a acestei serii, ați văzut cum să colectați informațiile de comitet din jurnalele git și să trimiteți solicitări de examinare dezvoltatorilor aleatorii selectați din lista de membri a proiectului.

În această parte, veți vedea cum să salvați informațiile de revizuire a codului pentru a continua de fiecare dată când rulează programatorul de coduri. Veți vedea, de asemenea, modul de citire a e-mailurilor pentru a verifica dacă recenzorul a răspuns la solicitarea de examinare.

Noțiuni de bază

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

git clone https://github.com/royagasthyan/CodeReviewer-Part2 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-ul are comitete legate de adresa de e-mail specială necesară pentru ca codul să se execute așa cum era de așteptat. 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.

Păstrarea informațiilor privind solicitarea de examinare

Pentru a urmări informațiile despre solicitarea de revizuire, trebuie să o păstrați undeva pentru referință. Puteți selecta unde doriți să păstrați informațiile despre solicitarea de revizuire a codului. Poate fi orice bază de date sau poate fi un fișier. De dragul acestui tutorial, vom păstra informațiile despre solicitarea de revizuire în interiorul unui reviewer.json fişier. De fiecare dată când se execută planificatorul, acesta verifică fișierul informativ pentru a urmări cererile de examinare care nu au răspuns.

Creați o metodă numită save_review_info care va salva informațiile de solicitare de revizuire în interiorul unui fișier. În interiorul save_review_info metoda, creați un info obiect cu recenzorul, subiectul și un ID unic.

def (uuid.uuid4 ()), 'sendDate': str (datetime.date.today ()) () 

Pentru un Id unic, importați UUID Modul Python.

import uuid

De asemenea, aveți nevoie de datetime Modul Python pentru a obține data curentă. Importați datetime Modul Python.

timpul de import

Trebuie să inițializați reviewer.json atunci când programul pornește dacă nu există deja.

dacă nu os.path.exists ('reviewer.json'): cu open ('reviewer.json', 'w +') ca outfile: json.dump ([], outfile)

Dacă fișierul nu există, trebuie să creați un fișier numit reviewer.json și umpleți-l cu o matrice JSON goală așa cum se vede în codul de mai sus.

Această metodă va fi apelată de fiecare dată când este trimisă o solicitare de examinare. Deci, în interiorul save_review_info metoda, deschideți reviewer.json fișier în modul de citire și citiți conținutul. Adăugați informațiile noi privind conținutul în conținutul existent și scrieți-l înapoi la reviewer.json fişier. Iată cum ar arăta codul:

def (uuid.uuid4 ()), 'sendDate': str (datetime.date.today ()) ()  cu open ('reviewer.json', 'r') ca infinit: review_data = json.load (infile) review_data.append (info) cu open ('reviewer.json', 'w' (review_data, outfile)

În interiorul schedule_review_request înainte de a trimite codul de solicitare de revizuire a codului, apelați save_review_info de salvare a informațiilor de revizuire.

def schedule_review_request (commits): date = time.strftime ("% Y-% m-% d") pentru comiterea comitetelor: reviewer = select_reviewer (commit.Author, project_members) subject = date + commit.Id + "]" body = "Bună ziua" "+ recenzent +" ', ați fost selectat să examinați codul de comitet \ n "body + =" done by "+ commit.Author + "body + =" \ n "corp + = format_review_commit (commit) save_review_info (recenzent, subiect); send_email (recenzent, subiect, corp)

Salvați modificările de mai sus și executați programul programator. Odată ce programul a fost rulat, ar trebui să puteți vizualiza reviewer.json fișier în interiorul directorului de proiect cu informațiile despre solicitarea de revizuire a codului. Iată cum ar arăta:

["recenzent": "[email protected]", "id": "8ca7da84-9da7-4a17-9843-be293ea8202c", "sendDate": "2017-02-24", "subiect": "2017-02 -24 Code Review [comite: 16393106c944981f57b2b48a9180a33e217faacc] ", " reviewer ":" [email protected] "," id ":" 68765291-1891-4b50-886e-e30ab41a8810 " 24 "," subject ":" 2017-02-24 Revizuirea codului [comite: 04d11e21fb625215c5e672a93d955f4a176e16e4] "]

Citirea datelor de e-mail

Ați colectat toate informațiile despre solicitarea de revizuire a codului și l-ați salvat în reviewer.json fişier. Acum, de fiecare dată când se rulează planificatorul, trebuie să verificați mesajele primite pentru a vedea dacă recenzorul a răspuns la solicitarea de revizuire a codului. Deci, mai întâi trebuie să definiți o metodă de citire a căsuței poștale Gmail.

Creați o metodă numită read_email care ia numărul de zile pentru a verifica căsuța de e-mail ca parametru. Veți face uz de imaplib Modul Python pentru a citi e-mailurile primite. Importați imaplib Modul Python:

import imaplib

Pentru a citi e - mailul folosind imaplib modul, trebuie mai întâi să creați serverul.

email_server = imaplib.IMAP4_SSL (SERVER)

Conectați-vă la server folosind adresa de e-mail și parola:

email_server.login (FROM_EMAIL, FROM_PWD)

După ce v-ați conectat, selectați căsuța de e-mail pentru a citi e-mailurile:

email_server.select ( 'inbox')

Veți citi mesajele de poștă electronică pentru numărul n de zile anterioare trimiterii cererii de revizuire a codului. Importați timedelta Modul Python. 

import timedelta

Creați data e-mailului după cum se arată:

email_date = datetime.date.today () - timedelta (zile = num_days) formatted_date = email_date.strftime ('% d-% b-% Y')

Utilizarea FORMATTED_DATE, căutați pe serverul de e-mail pentru e-mailuri.

tip, date = email_server.search (Niciuna, '(SINCE' '+ formatted_date +' ") ')

Acesta va returna ID-urile unice pentru fiecare e-mail, iar folosind ID-urile unice puteți obține detaliile de e-mail.

ids = data [0] id_list = ids.split () prima_email_id = int (id_list [0]) last_email_id = int (id_list [-1])

Acum veți profita de first_email_id si last_email_id să repetați prin e-mailuri și să preluați subiectul și adresa de la adresa e-mailurilor.

pentru i în intervalul (last_email_id, first_email_id, -1): typ, data = email_server.fetch (i, '(RFC822)')

date va conține conținutul de e-mail, astfel încât să iterați partea de date și să verificați un picior. Veți utiliza modulul Python pentru a extrage detaliile. Deci importă e-mail Modul Python. 

mail de import

Puteți extrage subiectul e-mailului și adresa "de la" după cum se arată:

pentru reply_part în date: ifinstance (răspuns_part, tuple): msg = email.message_from_string (answer_part [1]) print 'De la:' + msg ['from'] print ' subiect '] print' \ n 'print' ---------------------------------------- --------“

Aici este completă read_email metodă:

def date_server = imaplib.IMAP4_SSL (SERVER) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('inbox') email_date = datetime.date.today () - timedelta (zile = num_days) formatted_date = mail_date.strftime ('% d-% b-% Y') tip, data = email_server.search (Nici unul, '(SINCE' '+ formatted_date +' ") ') id_list = ids.split ) first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) pentru i în intervalul (last_email_id, first_email_id, -1): typ, data = email_server.fetch răspuns_part în date: ifinstance (răspuns_part, tuple): msg = email.message_from_string (answer_part [1]) print 'De la:' + msg ['from'] print '\ n' '] print' \ n 'print' ----------------------------------------- ------- 'cu excepția excepției, e: print str (e)

Salvați modificările de mai sus și încercați să executați cele de mai sus read_email metodă:

read_email (1)

Ar trebui să imprime subiectul e-mail-ului și adresa "de la" pe terminal. 

Acum, să colectăm adresa "de la" și subiectul într-un email_info afișați și returnați datele. 

email_info = []

În loc să tipăriți subiectul și adresa "de la", adăugați datele către email_info lista și returnați email_info listă.

email_info.append ( 'De la': msg [ 'din'], 'Subiect':. msg [ 'subiect'] înlocui ( "\ r \ n", ""))

Aici este modificat read_email metodă:

Definiți căutarea de e-mail (de exemplu, e-mail). În acest caz, puteți să trimiteți un e-mail la adresa de e-mail a adresei de e- num_days) formatted_date = email_date.strftime ('% d-% b-% Y') tip, data = email_server.search (none,'_SINCE '+ formatted_date + id_list_id_id = int (id_list [0]) last_email_id = int (id_list [-1]) pentru i în intervalul (last_email_id, first_email_id, -1): typ, data = email_server.fetch ) ') pentru răspunsul_part în date: ifinstance (răspuns_part, tuple): msg = email.message_from_string (answer_part [1]) email_info.append (' From ' subiectul "] înlocuiți (" \ r \ n "," ")) cu excepția excepției, e: print str (e) return email_info

Adăugarea înregistrării pentru manipularea erorilor

Gestionarea erorilor este un aspect important al dezvoltării de software. Este foarte util în timpul fazei de depanare pentru a detecta bug-uri. Dacă nu aveți nici o problemă de manipulare, atunci este foarte dificil să urmăriți eroarea. Din moment ce creșteți cu câteva metode noi, cred că este momentul potrivit pentru a adăuga tratarea erorilor la codul de programator.

Pentru a începe să rezolvați erorile, veți avea nevoie de logare Modulul Python și RotatingFileHandler clasă. Importați-le astfel:

importați logarea din logging.handlers importă RotatingFileHandler

După ce aveți importurile necesare, inițializați înregistrarea ca în imagine:

logger = logging.getLogger ("Jurnal de revizuire a codului") logger.setLevel (logging.INFO)

În codul de mai sus, ați inițializat loggerul și ați setat nivelul jurnalului la INFO. 

Creați un handler rotativ de jurnalizare a fișierelor care va crea un fișier nou de fiecare dată când fișierul jurnal a atins o dimensiune maximă.

logHandler = RotatingFileHandler ("app.log", maxBytes = 3000, backupCount = 2)

Atașați logHandler la logger obiect.

logger.addHandler (logHandler)

Să adăugăm loggerul de erori la logarea erorilor când este capturată o excepție. În read_email excepție, adăugați următorul cod:

logger.error (str (datetime.datetime.now ()) + "- Eroare la citirea e-mailului:" + str (e) + "\ n"

Prima linie înregistrează mesajul de eroare cu data și ora curente în fișierul jurnal. A doua linie înregistrează urmărirea stivei la eroare. 

În mod similar, puteți adăuga modul de gestionare a erorilor în partea principală a codului. Iată cum ar arăta codul cu gestionarea erorilor:

încercați: comits = process_commits () if len (commits) == 0: print 'Nu s-au găsit alte comitete': schedule_review_request (commits) excepție Exception, e: print 'Eroare. Verificați jurnalul pentru detalii. " logger.error (str (datetime.datetime.now ()) + "- Eroare la citirea e-mailului:" + str (e) + "\ n"

Înfășurați-o

În această parte a seriei, ați retras informațiile de solicitare de revizuire în reviewer.json fişier. De asemenea, ați creat o metodă de citire a e-mailurilor. Veți utiliza ambele funcții pentru a urmări solicitările de revizuire a codului din ultima parte a acestei serii.

În plus, nu ezitați să vedeți ce avem la dispoziție pentru vânzare și pentru a studia pe piață și nu ezitați să întrebați orice întrebări și să furnizați feedback-ul valoros utilizând feedul de mai jos.

Codul sursă din acest tutorial este disponibil pe GitHub.

Spuneți-ne gândurile și sugestiile în comentariile de mai jos.

Cod