Î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.
Î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.
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] "]
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
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"
Î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.