Een Python Code Review Scheduler bouwen de beoordelingsinformatie bijhouden

In het tweede deel van deze serie, zag je hoe je de commit-informatie verzamelt uit de git-logs en evaluatieverzoeken verzendt naar willekeurige ontwikkelaars geselecteerd uit de projectledenlijst.

In dit deel ziet u hoe u de codebeoordelingsinformatie opslaat die moet worden opgevolgd telkens wanneer de codeplanner wordt uitgevoerd. U zult ook zien hoe u e-mails kunt lezen om te controleren of de recensent heeft gereageerd op het beoordelingsverzoek.

Ermee beginnen

Begin met het klonen van de broncode uit het tweede deel van de zelfstudiereeks.

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

Wijzig de config.json bestand om enkele relevante e-mailadressen op te nemen, de [email protected] e-mailadres. Het is omdat het git commits heeft gerelateerd aan het specifieke e-mailadres dat nodig is om de code uit te voeren zoals verwacht. Wijzig de SMTP referenties in de schedule.py het dossier:

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

Navigeer naar de projectdirectory CodeReviewer en probeer de volgende opdracht in de terminal uit te voeren.

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

Het moet het verzoek om codewaarneming naar willekeurige ontwikkelaars sturen ter beoordeling.

Het bijhouden van de verzoek om beoordeling

Als u de informatie over de beoordelingsverzoek wilt opvolgen, moet u deze ter referentie bewaren. U kunt selecteren waar u de aanvraag voor codeverklaring wilt houden. Het kan elke database zijn of een bestand zijn. In het belang van deze zelfstudie houden we de informatie over het verzoek om een ​​recensie binnen een reviewer.json het dossier. Telkens wanneer de planner wordt uitgevoerd, controleert deze het infobestand om gevolg te geven aan de beoordelingsverzoeken waarop niet is gereageerd.

Maak een methode genaamd save_review_info waarmee de informatie over het beoordelingsverzoek in een bestand wordt opgeslagen. Binnen in de save_review_info methode, maak een info object met de recensent, onderwerp en een unieke id.

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

Voor een unieke id importeert u de uuid Python-module.

voer uuid in

Je hebt ook de datum Tijd Python-module om de huidige datum te krijgen. Importeer de datum Tijd Python-module.

import datetime

U moet de initialiseren reviewer.json bestand wanneer het programma start als het nog niet bestaat.

if not os.path.exists ('reviewer.json'): met open ('reviewer.json', 'w +') als outfile: json.dump ([], outfile)

Als het bestand niet bestaat, moet u een bestand maken met de naam reviewer.json en vul het met een lege JSON-array zoals te zien in de bovenstaande code.

Deze methode wordt elke keer dat een beoordelingsverzoek wordt verzonden aangeroepen. Dus, binnen de save_review_info methode, open de reviewer.json bestand in de leesmodus en lees de inhoud. Voeg de nieuwe inhoudsinformatie toe aan de bestaande inhoud en schrijf deze terug naar de reviewer.json het dossier. Hier is hoe de code eruit zou zien:

def save_review_info (reviewer, onderwerp): info = 'reviewer': reviewer, 'subject': subject, 'id': str (uuid.uuid4 ()), 'sendDate': str (datetime.date.today ())  met open ('reviewer.json', 'r') als infile: review_data = json.load (infile) review_data.append (info) met open ('reviewer.json', 'w') als outfile: json.dump (review_data, outfile)

Binnen in de schedule_review_request methode, voor het verzenden van de code beoordeling verzoek mail, bel de save_review_info methode om de beoordelingsinformatie op te slaan.

def schedule_review_request (commits): date = time.strftime ("% Y-% m-% d") voor commit in commits: reviewer = select_reviewer (commit.Author, project_members) subject = date + "Code Review [commit:" + commit.Id + "]" body = "Hallo '" + reviewer + "', je bent geselecteerd om de code voor commit te bekijken \ n" body + = "gedaan door '" + commit.Author + "'. \ n "body + =" \ n "body + = format_review_commit (commit) save_review_info (recensent, onderwerp); send_email (recensent, onderwerp, lichaam)

Sla de bovenstaande wijzigingen op en voer het planningsprogramma uit. Nadat de planner is uitgevoerd, zou u de reviewer.json bestand in de projectdirectory met de codeverklagende verzoekinformatie. Hier is hoe het eruit zou zien:

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

De e-mailgegevens lezen

U hebt alle informatie over de codeaanvraag verzameld en opgeslagen in de reviewer.json het dossier. Telkens wanneer de planner wordt uitgevoerd, moet u uw Postvak IN controleren om te zien of de revisor heeft gereageerd op het verzoek om codeherziening. Dus eerst moet je een methode definiëren om je Gmail-inbox te lezen.

Maak een methode genaamd read_email waarbij het aantal dagen duurt om de inbox als parameter te controleren. U zult gebruik maken van de imaplib Python-module om de e-mailinbox te lezen. Importeer de imaplib Python-module:

import imaplib

Om de e-mail te lezen met behulp van de imaplib module, moet u eerst de server maken.

email_server = imaplib.IMAP4_SSL (SERVER)

Log in op de server met het e-mailadres en wachtwoord:

email_server.login (FROM_EMAIL, FROM_PWD)

Nadat u bent ingelogd, selecteert u de inbox om de e-mails te lezen:

email_server.select ( 'inbox')

U leest de e-mails voor het afgelopen aantal dagen sinds het verzoek tot codeverificatie werd verzonden. Importeer de timedelta Python-module. 

tijdstempel importeren

Maak de e-maildatum zoals getoond:

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

De ... gebruiken FORMATTED_DATE, zoek in de e-mailserver naar e-mails.

typ, data = email_server.search (None, '(SINCE "' + formatted_date + '")')

Hiermee worden de unieke ID's voor elke e-mail geretourneerd en met behulp van de unieke ID's ontvangt u de e-mailgegevens.

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

Nu maakt u gebruik van de first_email_id en de last_email_id om de e-mails te doorlopen en het onderwerp en het "van" -adres van de e-mails op te halen.

voor i in bereik (last_email_id, first_email_id, -1): typ, data = email_server.fetch (i, '(RFC822)')

gegevens zal de e-mailinhoud bevatten, dus herhaler het datagedeelte en controleer op een tuple. U maakt gebruik van de module Python e-mail om de details op te halen. Dus importeer de e-mail Python-module. 

importeer email

U kunt het onderwerp van de e-mail en het "van" -adres extraheren zoals getoond:

voor response_part in data: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) print 'From:' + msg ['from'] print '\ n' print 'Onderwerp:' + msg [' onderwerp '] afdrukken' \ n 'afdrukken' ---------------------------------------- --------'

Hier is het complete read_email methode:

def read_email (num_days): try: email_server = imaplib.IMAP4_SSL (SERVER) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('inbox') email_date = datetime.date.today () - timedelta (days = num_days) formatted_date = email_date.strftime ('% d-% b-% Y') typ, data = email_server.search (Geen, '(SINCE "' + formatted_date + '")') ids = data [0] id_list = ids.split ( ) first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) voor i in bereik (last_email_id, first_email_id, -1): typ, data = email_server.fetch (i, '(RFC822)') voor response_part in data: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) print 'From:' + msg ['from'] print '\ n' print 'Onderwerp:' + msg ['subject '] print' \ n 'print' ----------------------------------------- ------- 'behalve uitzondering, e: print str (e)

Sla de bovenstaande wijzigingen op en voer het bovenstaande uit read_email methode:

read_email (1)

Het moet het onderwerp van de e-mail en het "van" -adres op de terminal afdrukken. 

Laten we nu het 'van'-adres en onderwerp verzamelen in een email_info lijst en retourneer de gegevens. 

email_info = []

In plaats van het onderwerp en het "van" -adres af te drukken, voegt u de gegevens toe aan de email_info lijst en retourneer de email_info lijst.

email_info.append ( 'Van': msg [ 'uit'], 'Subject':. msg [subject] vervangen ( "\ r \ n", ""))

Dit is het aangepaste read_email methode:

def read_email (num_days): try: email_info = [] email_server = imaplib.IMAP4_SSL (SERVER) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('inbox') email_date = datetime.date.today () - timedelta (days = num_days) formatted_date = email_date.strftime ('% d-% b-% Y') typ, data = email_server.search (Geen, '(SINCE "' + formatted_date + '")') ids = data [0] id_list = ids.split () first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) voor i in bereik (last_email_id, first_email_id, -1): typ, data = email_server.fetch (i, '(RFC822 ) ') voor response_part in data: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) email_info.append (' From ': msg [' from '],' Subject ': msg [' subject ']. replace ("\ r \ n", "")) behalve uitzondering, e: print str (e) return email_info

Logging toevoegen voor foutafhandeling

Foutafhandeling is een belangrijk aspect van softwareontwikkeling. Het is echt handig tijdens de foutopsporingsfase om bugs te traceren. Als u geen foutafhandeling hebt, wordt het erg moeilijk om de fout op te sporen. Omdat je met een aantal nieuwe methoden groeit, denk ik dat dit het juiste moment is om foutafhandeling toe te voegen aan de schedulercode.

Als u aan de slag wilt gaan met het afhandelen van fouten, heeft u de logging Python-module en de RotatingFileHandler klasse. Importeer ze zoals getoond:

import logging van logging.handlers importeert RotatingFileHandler

Zodra u de vereiste import heeft, initialiseert u de logger zoals getoond:

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

In de bovenstaande code hebt u de logger geïnitialiseerd en het logniveau ingesteld op INFO. 

Maak een roterende logboekhandler voor bestanden die een nieuw bestand maakt telkens wanneer het logbestand een maximale grootte heeft bereikt.

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

Bevestig de LogHandler naar de houthakker voorwerp.

logger.addHandler (LogHandler)

Laten we de foutlogger toevoegen om fouten te loggen wanneer een uitzondering wordt betrapt. In de read_email methode uitzonderingsgedeelte, voeg de volgende code toe:

logger.error (str (datetime.datetime.now ()) + "- Fout tijdens het lezen van mail:" + str (e) + "\ n") logger.exception (str (e))

De eerste regel logt het foutbericht met de huidige datum en tijd in het logbestand. De tweede regel registreert de stapeltracering naar de fout. 

Op dezelfde manier kunt u de foutafhandeling toevoegen aan het hoofdgedeelte van de code. Hier is hoe de code met foutafhandeling eruit zou zien:

try: commits = process_commits () if len (commits) == 0: print 'Geen commits gevonden' anders: schedule_review_request (commits) except Exception, e: print 'Fout opgetreden. Controleer log voor details. ' logger.error (str (datetime.datetime.now ()) + "- Fout tijdens het lezen van mail:" + str (e) + "\ n") logger.exception (str (e))

Inpakken

In dit deel van de serie hebt u de informatie over het beoordelingsverzoek in de reviewer.json het dossier. Je hebt ook een methode gemaakt om de e-mails te lezen. Je zult deze beide functies gebruiken om de codeaanvragen in het laatste deel van deze serie op te volgen.

Aarzel niet om te zien wat we te koop aanbieden en om te studeren op de markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.

Broncode van deze tutorial is beschikbaar op GitHub.

Laat ons uw mening en suggesties weten in de opmerkingen hieronder.