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