Å bygge en Python Code Review Scheduler Holde Review Information

I den andre delen av denne serien så du hvordan du samler innbudsinformasjonen fra git-loggene og sender anmelderforespørsler til tilfeldige utviklere valgt fra prosjektlederlisten.

I denne delen ser du hvordan du lagrer kodevurderingsinformasjonen for å følge opp hver gang kodeplanleggeren kjøres. Du får også se hvordan du leser e-postmeldinger for å sjekke om anmelderen har svart på forespørselen om forespørsel.

Starter

Start med å klone kildekoden fra den andre delen av opplæringsserien.

git klon https://github.com/royagasthyan/CodeReviewer-Part2 CodeReviewer

Endre config.json fil for å inkludere noen relevante e-postadresser, holde [email protected] epostadresse. Det er fordi git har forpliktet seg i forbindelse med den bestemte e-postadressen som kreves for at koden skal utføres som forventet. Endre SMTP legitimasjon i schedule.py fil:

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

Naviger til prosjektkatalogen CodeReviewer og prøv å utføre følgende kommando i terminalen.

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

Det bør sende koden gjennomgang forespørsel til tilfeldige utviklere for gjennomgang.

Holder forespørselsinformasjonen om gjennomgang

For å følge opp forespørselsinformasjonen må du holde den et sted som referanse. Du kan velge hvor du vil beholde informasjon om koden, om du vil ha forespørsel. Det kan være hvilken som helst database eller kan være en fil. For denne veiledningens skyld beholder vi forespørselsinformasjonen i en reviewer.json fil. Hver gang planleggeren kjøres, kontrollerer den info-filen for å følge opp forespørslene om forespørsel som ikke har blitt besvart.

Opprett en metode som kalles save_review_info som vil lagre forespørselsinformasjonen i en fil. Inne i save_review_info metode, opprett en info objekt med anmelder, emne og et unikt id.

def save_review_info (anmelder, emne): info = 'reviewer': reviewer, 'subject': emne, 'id': str (uuid.uuid4 ()), 'sendDate': str (datetime.date.today 

For et unikt ID, importere UUID Python-modul.

importere uuid

Du trenger også dato tid Python modul for å få dagens dato. Importer dato tid Python-modul.

importer datetime

Du må initialisere reviewer.json fil når programmet starter hvis det ikke allerede eksisterer.

hvis ikke os.path.exists ('reviewer.json'): med åpen ('reviewer.json', 'w +') som utgave: json.dump ([], outfile)

Hvis filen ikke eksisterer, må du opprette en fil som heter reviewer.json og fyll det med et tomt JSON-array som vist i koden ovenfor.

Denne metoden vil bli kalt hver gang en forespørsel om anmeldelse sendes. Så inne i save_review_info metode, åpne reviewer.json fil i lesemodus og les innholdet. Legg til den nye innholdsinformasjonen i det eksisterende innholdet og skriv det tilbake til reviewer.json fil. Slik ser koden ut:

def save_review_info (anmelder, emne): info = 'reviewer': reviewer, 'subject': emne, 'id': str (uuid.uuid4 ()), 'sendDate': str (datetime.date.today  med åpen ('reviewer.json', 'r') som infile: review_data = json.load (infile) review_data.append (info) med åpen ('reviewer.json', 'w') som utgave: json.dump (review_data, outfile)

Inne i schedule_review_request metode, før du sender kodeanmeldelsesforespørselen mail, ring save_review_info metode for å lagre anmeldelsesinformasjonen.

def plan_review_request (commits): date = time.strftime ("% Y-% m-% d") for commit commit: reviewer = select_reviewer (commit.Author, project_members) emne = dato + "Code Review [commit:" + commit.Id + "]" body = "Hei" "+ anmelder +" ', du har blitt valgt for å se koden for commit \ n "body + =" gjort av' "commit.author +" '. "body + =" \ n "body + = format_review_commit (commit) save_review_info (korrekturleser, emne); send_email (korrektur, emne, kropps)

Lagre endringene ovenfor og utfør planleggerprogrammet. Når planleggeren har blitt kjørt, bør du kunne se reviewer.json fil inne i prosjektkatalogen med koden gjennomgang forespørsel informasjon. Slik ser det ut:

["reviewer": "[email protected]", "id": "8ca7da84-9da7-4a17-9843-be293ea8202c", "sendDate": "2017-02-24", "emne": "2017-02 -24 Code Review [commit: 16393106c944981f57b2b48a9180a33e217faacc] ", " anmelder ":" [email protected] "," id ":" 68765291-1891-4b50-886e-e30ab41a8810 "," sendDate ":" 2017-02- 24 "," emne ":" 2017-02-24 Kodeanmeldelse [commit: 04d11e21fb625215c5e672a93d955f4a176e16e4] "]

Leser e-postdataene

Du har samlet inn alle forespørselsinformasjon om kodeanmeldelse og lagret den i reviewer.json fil. Nå, hver gang planleggeren kjøres, må du sjekke postboksen din for å se om anmelderen har svart på forespørselen om kodeanmeldelse. Så først må du definere en metode for å lese Gmail-innboksen din.

Opprett en metode som kalles read_email som tar antall dager for å sjekke innboksen som en parameter. Du vil gjøre bruk av imaplib Python-modulen for å lese e-postboksen. Importer imaplib Python-modul:

importere imaplib

For å lese e-posten ved hjelp av imaplib modul, må du først opprette serveren.

email_server = imaplib.IMAP4_SSL (SERVER)

Logg inn på serveren ved hjelp av e-postadressen og passordet:

email_server.login (FROM_EMAIL, FROM_PWD)

Når du er logget inn, velg innboksen for å lese e-postene:

email_server.select ( 'innboks')

Du vil lese e-postene de siste nene dagene siden forespørselen om kodeanmeldelse ble sendt. Importer timedelta Python-modul. 

importere timedelta

Opprett e-postdato som vist:

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

Bruker FORMATTED_DATE, søk e-postserveren for e-post.

type, data = email_server.search (Ingen, '(SINCE' '+ formatted_date +' ") ')

Den vil returnere de unike ID-ene for hver e-post, og ved hjelp av de unike IDene kan du få e-postadressene.

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

Nå vil du gjøre bruk av first_email_id og last_email_id å iterere gjennom e-postene og hente emnet og "fra" -adressen til e-postene.

for jeg i rekkevidde (last_email_id, first_email_id, -1): type, data = email_server.fetch (jeg, '(RFC822)')

data vil inneholde e-postinnholdet, så gjenta data-delen og se etter en tuple. Du vil benytte deg av Python-modulen for å trekke ut detaljene. Så importere e-post Python-modul. 

importere e-post

Du kan trekke ut emnefeltet og "fra" -adressen som vist:

for respons_part i data: hvis isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) skriv ut 'Fra:' + msg ['from'] print '\ n' print 'Emne:' + msg [' emne '] print' \ n 'print' ---------------------------------------- --------'

Her er komplett read_email metode:

def read_email (num_days): prøv: email_server = imaplib.IMAP4_SSL (SERVER) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('innboks') email_date = datetime.date.today () - timedelta (days = num_days) formatted_date = email_date.strftime ('% d-% b-% Y'), data = email_server.search (Ingen, '(SINCE' '+ formatted_date +' ") ') ids = data [0] id_list = ids.split ) first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) for jeg i rekkevidde (last_email_id, first_email_id, -1): type, data = email_server.fetch (jeg, '(RFC822)') for response_part i data: hvis isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) skriv ut 'Fra:' + msg ['from'] print '\ n' print 'Emne:' + msg '] print' \ n 'print' ----------------------------------------- ------- 'unntatt unntak, e: print str (e)

Lagre endringene ovenfor og prøv å kjøre ovenstående read_email metode:

read_email (1)

Det skal skrive ut emnefeltet og "fra" -adressen på terminalen. 

La oss nå samle "fra" -adressen og emnet inn i en email_info liste og returnere dataene. 

email_info = []

I stedet for å skrive ut emnet og "fra" -adressen, legger du dataene til email_info liste og returnere email_info liste.

email_info.append ( 'Fra': msg [ 'fra'], 'Emne':. msg [ 'gjenstand'] erstatte ( "\ r \ n", ""))

Her er den endrede read_email metode:

def read_email (num_days): prøv: email_info = [] email_server = imaplib.IMAP4_SSL (SERVER) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('innboks') email_date = datetime.date.today () - timedelta num_days) formatted_date = email_date.strftime ('% d-% b-% Y') type, data = email_server.search (Ingen, '(SINCE' '+ formatted_date +' ") ') ids = data [0] id_list = ids.split () first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) for jeg i rekkevidde (last_email_id, first_email_id, -1): type, data = email_server.fetch (i, '(RFC822 ) 'for respons_part i data: hvis isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) email_info.append (' Fra ': msg [' from '],' Subject ': msg [' emne ']. erstatt ("\ r \ n", "")) unntatt Unntak, e: print str (e) returnere email_info

Legge til logging for feilhåndtering

Feilhåndtering er et viktig aspekt ved programvareutvikling. Det er veldig nyttig i feilsøkingsfasen for å spore bugs. Hvis du ikke har feilhåndtering, blir det veldig vanskelig å spore feilen. Siden du vokser med et par nye metoder, synes jeg det er riktig tidspunkt å legge til feilhåndtering i planleggerkoden.

For å komme i gang med feilhåndtering, vil du trenge logging Python modul og RotatingFileHandler klasse. Importer dem som vist:

importer logg fra logging.handlers importere RotatingFileHandler

Når du har den nødvendige importen, skal du initialisere loggeren som vist:

logger = logging.getLogger ("Code Review Log") logger.setLevel (logging.INFO)

I ovennevnte kode initierte du loggeren og satte loggnivået til INFO. 

Opprett en roterende fillogghåndterer som vil opprette en ny fil hver gang loggfilen har nådd en maksimal størrelse.

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

Fest logHandler til logger gjenstand.

logger.addHandler (logHandler)

La oss legge til feilloggeren for å logge feil når et unntak er fanget. I read_email Metoden er unntak del, legg til følgende kode:

logger.error (str (datetime.datetime.now ()) + "- Feil mens du leser e-post:" + str (e) + "\ n") logger.exception (str e))

Den første linjen logger feilmeldingen med gjeldende dato og klokkeslett til loggfilen. Den andre linjen logger stakken til feilen. 

På samme måte kan du legge til feilhåndteringen til hoveddelen av koden. Slik ser koden med feilhåndtering ut:

Prøv: commits = process_commits () hvis len (forplikter) == 0: print 'No commits found' annet: schedule_review_request (commits) unntatt Unntak, e: print 'Feil oppstod. Sjekk logg for detaljer. ' logger.error (str (datetime.datetime.now ()) + "- Feil mens du leser e-post:" + str (e) + "\ n") logger.exception (str e))

Pakke det opp

I denne delen av serien lagret du forespørselsinformasjonen i reviewer.json fil. Du har også opprettet en metode for å lese e-postene. Du bruker begge disse funksjonene til å følge opp forespørsler om kodeanmeldelse i den siste delen av denne serien.

I tillegg, ikke nøl med å se hva vi har tilgjengelig for salg og for studier på markedet, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved hjelp av feedet under.

Kildekode fra denne opplæringen er tilgjengelig på GitHub.

Gi oss beskjed om dine tanker og forslag i kommentarene nedenfor.