Opprette en Python Code Review Scheduler Gjennomgå oppfølging

I den tredje delen av denne serien så du hvordan du lagrer kodenevalueringsforespørselsinformasjonen for oppfølging. Du opprettet en metode som heter read_email for å hente e-postene fra innboksen for å sjekke om en anmelder har svart på forespørselen om kodeanmeldelse. Du har også implementert feilhåndtering i kodeoversiktplanleggerkoden.

I denne delen av serien bruker du den lagrede kodevurderingsinformasjonen og informasjonen fra e-postene for å sjekke om anmelderen har svart på forespørselen om anmeldelse. Hvis en forespørsel ikke er besvart, sender du en oppfølgings-e-post til anmelderen.

Starter

Start med å klone kildekoden fra tredje del av opplæringsserien.

git klone https://github.com/royagasthyan/CodeReviewer-Part3 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 denne 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 skal sende koden gjennomgang forespørsel til tilfeldige utviklere for gjennomgang og lage en reviewer.json fil med gjennomgangsinformasjon.

Implementere en oppfølgingsforespørsel

La oss starte med å lage en oppfølgingsforespørselsmetode som heter followup_request. Inne i followup_request metode, les reviewer.json fil og hold innholdet i en liste. Slik ser koden ut:

med åpen ('reviewer.json', 'r') som følger: review_info = json.load (jfile)

Deretter trekker du inn e-postinformasjonen ved hjelp av read_email metode som du implementerte i den siste opplæringen.

email_info = read_email (no_days)

Hvis korrekturleseren har svart på forespørselen om anmeldelse, bør det være en e-post med samme emne og a Re: tag prefixed til den. Så iterate gjennom revisjonsinformasjonslisten og sammenlign gjenstanden med e-postfeltet for å se om anmelderen har svart på forespørselen.

for gjennomgang i review_info: review_replied = false expected_subject = 'RE:' + anmeldelse ['subject'] for e-post i email_info: hvis expected_subject == email ['subject']: review_replied = True print 'Reviewer har svart'

Som vist i den ovennevnte koden, har du iterert gjennom review_info liste og sjekket gjenopplysningsfaget mot e-postpersonalet for å se om anmelderen har svart.

Nå, når korrekturleseren har svart på forespørselen om kodeanmeldelse, trenger du ikke å beholde bestemt gjennomgangsinformasjon i reviewer.json fil. Så opprett en Python-metode kalt Delete_Info for å fjerne den bestemte gjennomgangsinformasjonen fra reviewer.json fil. Her er hvordan Delete_Info utseende:

def Delete_Info (info, id): for jeg i xrange (len (info)): hvis info [i] ['id'] == id: info.pop

Som vist i den ovennevnte koden, har du iterert gjennom gjennomgangslisten og slettet oppføringen som samsvarer med ID. Etter å ha fjernet informasjonen fra filen, returner listen.

Du må ringe Delete_Info metode når et bestemt stykke gjennomgangsinformasjon besvares. Når du ringer til Delete_Info metode, må du passere en kopi av review_info slik at den opprinnelige informasjonslisten ikke endres. Du trenger den opprinnelige revisjonsinformasjonslisten for sammenligning senere. Så importere kopiere Python-modul for å lage en kopi av den opprinnelige revisjonsinformasjonslisten.

fra kopi import kopi

Lag en kopi av review_info liste.

review_info_copy = copy (review_info)

Når du sletter gjennomgangsinformasjonen som har blitt besvart fra den opprinnelige listen, sender du kopieringslisten til Delete_Info metode.

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

Her er followup_request metode:

def followup_request (): med åpen ('reviewer.json', 'r') som referile: review_info = json.load (jfile) review_info_copy = copy (review_info) email_info = read_email (no_days) for gjennomgang i review_info: review_replied = False expected_subject = 'Re:' + anmeldelse ['subject'] for email i email_info: if expected_subject == email ['Subject']: review_replied = Sann review_info_copy = Delete_Info (review_info_copy, review ['id']) break;

Nå, når review_info listen har blitt iterated, du må sjekke om det er noen endringer i reviewer.json fil. Hvis eksisterende gjennomgangsinformasjon er fjernet, må du oppdatere reviewer.json filen riktig. Så sjekk om review_info_copy og review_info er de samme, og oppdaterer reviewer.json fil. 

hvis review_info_copy! = review_info: med åpen ('reviewer.json', 'w') som outfile: json.dump (review_info_copy, outfile)

Her er komplett followup_request metode:

def followup_request (): med åpen ('reviewer.json', 'r') som referile: review_info = json.load (jfile) review_info_copy = copy (review_info) email_info = read_email (no_days) for gjennomgang i review_info: review_replied = False expected_subject = 'Re:' + anmeldelse ['subject'] for email i email_info: if expected_subject == email ['Subject']: review_replied = Sann review_info_copy = Delete_Info (review_info_copy, review ['id']) break; hvis review_info_copy! = review_info: med åpen ('reviewer.json', 'w') som outfile: json.dump (review_info_copy, outfile)

Ringe til followup_request metode for å følge opp forespørsler om gjennomgang som allerede er sendt.

Prøv: commits = process_commits () # Lagt til oppfølgingsmetoden followup_request () 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 oppstod:" + str (e) + "\ n") logger.exception (str e)) 

Lagre endringene ovenfor. For å teste oppfølgingsfunksjonaliteten, slett du reviewer.json fil fra prosjektkatalogen. Kjør nå planleggeren slik at forespørsler om kodeanmeldelse sendes til tilfeldige utviklere. Sjekk om denne informasjonen er lagret i reviewer.json fil.

Be den bestemte utvikleren å svare på kodesøknadsforespørselen ved å svare på e-posten. Kjør nå planleggeren igjen, og denne gangen bør planleggerprogrammet finne svaret og fjerne det fra reviewer.json fil.

Sende påminnelses-e-post

Når korrekturleseren har svart på forespørselen om kodeanmeldelsesforespørsel, må denne informasjonen fjernes fra reviewer.json fil siden du ikke trenger å spore den videre. Hvis anmelderen ennå ikke har svart på forespørselen om kodeanmeldelse, må du sende en oppfølgingsmelding for å minne ham eller henne om anmelderforespørselen.

Kodeanmeldelsesplanleggeren ville løpe på daglig basis. Når det kjøres, må du først sjekke om det har vært en viss tid siden utvikleren har svart på forespørselen om anmeldelse. I prosjektkonfigurasjonen kan du angi en gjennomgangstid hvor, hvis anmelderen ikke har svart, ville planleggeren sende en påminnelses-epost.

La oss starte med å legge til en konfigurasjon i prosjektet config. Legg til en ny config kalt followup_frequency i config-filen.

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

Så når anmelderen ikke har svart på followup_frequency Antall dager, du sender en påminnelses-e-post. Les konfigurasjonen i en global variabel mens du leser konfigurasjonene:

for p i main_config: hvis p ['navn'] == prosjekt: project_url = p ['git_url'] project_members = p ['members'] followup_frequency = p ['followup_frequency'] pause

Inne i followup_request Metode, send en påminnelses-e-post når anmelderen ikke har svart på oppfølgingsforespørsmålene for followup_frequency antall dager. Beregn antall dager siden anmeldelsen ble sendt.

review_date = datetime.datetime.strptime (anmeldelse ['sendDate'], '% Y-% m-% d') i dag = datetime.datetime.today () days_since_review = (i dag - review_date) .days

Hvis antall dager er større enn oppfølgingsfrekvensdatoen i konfigurasjonene, send påminnelsesmeldingen.

hvis ikke review_replied: hvis days_since_review> followup_frequency: send_email (anmeldelse ['reviewer'], 'Påminnelse:' + anmeldelse ['emne'], '\ nDu har ikke svart på anmelderforespørselen \ n')

Her er komplett followup_request metode:

def followup_request (): med åpen ('reviewer.json', 'r') som referile: review_info = json.load (jfile) review_info_copy = copy (review_info) email_info = read_email (no_days) for gjennomgang i review_info: review_date = datetime. datetime.strptime (review ['sendDate'], '% Y-% m-% d') i dag = datetime.datetime.today () days_since_review = (i dag - review_date) .days review_replied = False expected_subject = 'Re:' + anmeldelse ['emne'] for e-post i email_info: if expected_subject == email ['Subject']: review_replied = Sann review_info_copy = Delete_Info (review_info_copy, review ['id']) break; hvis ikke review_replied: hvis days_since_review> followup_frequency: send_email (anmeldelse ['reviewer'], 'Påminnelse:' + anmeldelse ['emne'], '\ nDu har ikke svart på anmeldelseforespørselen \ n') hvis review_info_copy! = review_info: med åpen ('reviewer.json', 'w') som outfile: json.dump (review_info_copy, outfile)

Pakke det opp

I denne veiledningen så du hvordan du implementerer logikken for å følge opp forespørsler om kodeanmeldelse. Du har også lagt til funksjonaliteten for å sende en påminnelses-e-post hvis anmelderen ikke har svart på eposten i et bestemt antall dager. 

Denne Python-kode anmelder kan forbedres ytterligere for å dekke dine behov. Gjør gaffelbeholderen og legg til nye funksjoner, og gi oss beskjed i kommentarene nedenfor.

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