Construire un planificateur de révision de code Python conserver les informations de révision

Dans la deuxième partie de cette série, vous avez vu comment collecter les informations de validation dans les journaux git et envoyer des demandes de révision à des développeurs choisis au hasard dans la liste des membres du projet..

Dans cette partie, vous verrez comment enregistrer les informations de révision de code afin de les suivre chaque fois que le planificateur de code est exécuté. Vous verrez également comment lire les courriels pour vérifier si le réviseur a répondu à la demande de révision..

Commencer

Commencez par cloner le code source de la deuxième partie de la série de tutoriels.

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

Modifier le config.json fichier pour inclure des adresses e-mail pertinentes, en gardant le [email protected] adresse électronique. C'est parce que git a des commits liés à l'adresse e-mail particulière qui est requise pour que le code s'exécute comme prévu. Modifier le SMTP pouvoirs dans le schedule.py fichier:

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

Accédez au répertoire du projet CodeReviewer et essayez d'exécuter la commande suivante dans le terminal.

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

Il devrait envoyer la demande de révision de code à des développeurs aléatoires pour vérification..

Conserver les informations de demande de révision

Pour faire un suivi sur les informations de demande de révision, vous devez les conserver quelque part à titre de référence. Vous pouvez sélectionner l'emplacement où vous souhaitez conserver les informations de demande de révision de code. Il peut s'agir de n'importe quelle base de données ou d'un fichier. Dans l’intérêt de ce didacticiel, nous conserverons les informations de demande de révision dans un reviewer.json fichier. Chaque fois que le planificateur est exécuté, il vérifie le fichier d'informations pour donner suite aux demandes de révision auxquelles il n'a pas été répondu..

Créez une méthode appelée save_review_info qui sauvegardera les informations de demande de révision dans un fichier. À l'intérieur de save_review_info méthode, créer un Info objet avec le relecteur, le sujet et un identifiant unique.

def save_review_info (relecteur, sujet): info = 'relecteur': relecteur, 'sujet': sujet, 'id': str (uuid.uuid4 ()), 'sendDate': str (datetime.date.today ()) 

Pour un identifiant unique, importez le uuid Module Python.

importer uuid

Vous avez aussi besoin du date / heure Module Python pour obtenir la date actuelle. Importer le date / heure Module Python.

importer date / heure

Vous devez initialiser le reviewer.json fichier lorsque le programme démarre s'il n'existe pas déjà.

sinon, os.path.exists ('reviewer.json'): avec open ('reviewer.json', 'w +') en tant que fichier sortant: json.dump ([], fichier externe)

Si le fichier n'existe pas, vous devez créer un fichier appelé reviewer.json et remplissez-le avec un tableau JSON vide, comme indiqué dans le code ci-dessus.

Cette méthode sera appelée chaque fois qu'une demande de révision est envoyée. Donc, à l'intérieur du save_review_info méthode, ouvrez le reviewer.json fichier en mode lecture et lecture du contenu. Ajoutez les nouvelles informations de contenu au contenu existant et réécrivez-les dans reviewer.json fichier. Voici à quoi ressemblerait le code:

def save_review_info (relecteur, sujet): info = 'relecteur': relecteur, 'sujet': sujet, 'id': str (uuid.uuid4 ()), 'sendDate': str (datetime.date.today ())  avec open ('reviewer.json', 'r') en tant que infile: review_data = json.load (infile) review_data.append (info) avec open ('reviewer.json', 'w'): json.dump (review_data, outfile)

À l'intérieur de schedule_review_request Avant d'envoyer le courrier de demande de révision de code, appelez le save_review_info méthode pour enregistrer les informations de révision.

def schedule_review_request (commits): date = time.strftime ("% Y-% m-% d") pour le commit dans les commits: reviewer = select_reviewer (commit.Auteur, project_members) subject = date + "Vérification du code [commit:" + commit.Id + "]" body = "Hello '" + relecteur + "', vous avez été sélectionné pour vérifier le code de commit \ n" body + = "effectué par '" + commit.Author + "'. \ n "body + =" \ n "body + = format_review_commit (commit) save_review_info (relecteur, sujet); send_email (relecteur, sujet, corps)

Enregistrez les modifications ci-dessus et exécutez le programme de planification. Une fois que le planificateur a été exécuté, vous devriez pouvoir voir le reviewer.json fichier dans le répertoire du projet avec les informations de demande de révision de code. Voici à quoi cela ressemblerait:

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

Lecture des données de courrier électronique

Vous avez collecté toutes les informations de demande de révision de code et les avez enregistrées dans le répertoire. reviewer.json fichier. Maintenant, chaque fois que le planificateur est exécuté, vous devez vérifier votre boîte de réception pour voir si le réviseur a répondu à la demande de révision du code. Alors, vous devez d’abord définir une méthode pour lire votre boîte de réception Gmail..

Créez une méthode appelée read_email ce qui prend le nombre de jours pour vérifier la boîte de réception en tant que paramètre. Vous allez utiliser le imaplib Module Python pour lire la boîte de réception. Importer le imaplib Module Python:

importer imaplib

Pour lire le courrier électronique à l'aide du imaplib module, vous devez d'abord créer le serveur.

serveur_email = imaplib.IMAP4_SSL (SERVEUR)

Connectez-vous au serveur en utilisant l'adresse email et le mot de passe:

email_server.login (FROM_EMAIL, FROM_PWD)

Une fois connecté, sélectionnez la boîte de réception pour lire les emails:

email_server.select ('boîte de réception')

Vous lirez les courriels au cours des n derniers jours depuis l'envoi de la demande de révision du code. Importer le timedelta Module Python. 

importer timedelta

Créez la date de l'e-mail comme indiqué:

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

En utilisant le date_formaté, rechercher des emails sur le serveur de messagerie.

typ, data = email_server.search (aucun, '(SINCE "' + date_formaté + '")')

Il renverra les identifiants uniques pour chaque email, et en utilisant les identifiants uniques, vous pouvez obtenir les détails de l'email..

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

Maintenant, vous allez utiliser le first_email_id et le last_email_id parcourir les emails et aller chercher le sujet et l'adresse "de" des emails.

pour i dans la plage (last_email_id, first_email_id, -1): typ, data = serveur_email.fetch (i, '(RFC822)')

Les données contiendra le contenu de l'email, donc itérerez la partie données et rechercherez un tuple. Vous utiliserez le module de messagerie Python pour extraire les détails. Alors importez le email Module Python. 

import email

Vous pouvez extraire le sujet de l'email et l'adresse "de" comme indiqué:

pour response_part dans les données: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) print 'From:' + msg ['from'] print '\ n' print 'Subject:' + msg [' sujet '] print' \ n 'print' ------------------------------------------------ -------- '

Voici le complet read_email méthode:

def read_email (num_days): try: serveur_email = imaplib.IMAP4_SSL (SERVEUR) serveur_email.login (FROM_EMAIL, FROM_PWD) serveur_email.select ('mailbox') email_date = datetime.date.today () - timedelta (days = num_days) email_date.strftime ('% d-% b-% Y') typ, data = email_server.search (Aucun, '(SINCE "' + formated_date + '")') ids = data [0] id_list = ids.split ( ) first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) pour i dans la plage (last_email_id, first_email_id, -1): typ, data = serveur_email.fetch (i, '(RFC822)') pour response_part dans les données: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) print 'From:' + msg ['from'] print '\ n' print 'Subject:' + msg ['subject '] print' \ n 'print' --------------------------------------------- ------- 'sauf Exception, e: print str (e)

Enregistrez les modifications ci-dessus et essayez de les exécuter. read_email méthode:

read_email (1)

Il faut imprimer le sujet de l'email et l'adresse "de" sur le terminal. 

Maintenant, rassemblons l’adresse "de" et le sujet dans un email_info lister et renvoyer les données. 

email_info = []

Au lieu d’imprimer le sujet et l’adresse "De", ajoutez les données au email_info lister et retourner le email_info liste.

email_info.append ('De': msg ['de'], 'Sujet': msg ['sujet']. remplacer ("\ r \ n", ""))

Voici le modifié read_email méthode:

def read_email (num_days): try: email_info = [] email_server = imaplib.IMAP4_SSL (SERVEUR) email_server.login (FROM_EMAIL, FROM_PWD) email_server.select ('mailbox') email_date = datetime.date.today () - timedelta (jours) nombre_jours) date_du_format = email_date.strftime ('% d-% b-% Y') typ, data = serveur_email.search (Aucun, '(SINCE "' + date_formaté + '') ') ids = data [0] id_list = ids.split () first_email_id = int (id_list [0]) last_email_id = int (id_list [-1]) pour i dans la plage (last_email_id, first_email_id, -1): typ, data = email_server.fetch (i, '(RFC822) ) ') pour response_part dans les données: if isinstance (response_part, tuple): msg = email.message_from_string (response_part [1]) email_info.append (' De ': msg [' de '],' Subject ': msg [' subject ']. replace ("\ r \ n", "")) sauf Exception, e: print str (e) return email_info

Ajout de la journalisation pour la gestion des erreurs

La gestion des erreurs est un aspect important du développement logiciel. C'est vraiment utile pendant la phase de débogage pour tracer les bogues. Si vous ne gérez pas les erreurs, il devient très difficile de les suivre. Étant donné que vous utilisez de nouvelles méthodes, je pense que le moment est venu d'ajouter la gestion des erreurs au code du planificateur..

Pour commencer à gérer les erreurs, vous aurez besoin de la enregistrement Module Python et le RotatingFileHandler classe. Importez-les comme indiqué:

importation de la journalisation à partir de logging.handlers importation RotatingFileHandler

Une fois que vous avez les importations requises, initialisez l’enregistreur comme indiqué:

logger = logging.getLogger ("Journal de révision du code") logger.setLevel (logging.INFO)

Dans le code ci-dessus, vous avez initialisé le consignateur et défini le niveau de consignation sur INFO.. 

Créer un gestionnaire de journaux de fichiers en rotation qui créera un nouveau fichier chaque fois que le fichier journal aura atteint une taille maximale.

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

Joindre le logHandler au enregistreur objet.

logger.addHandler (logHandler)

Ajoutons le consignateur d'erreurs pour consigner les erreurs lorsqu'une exception est interceptée. dans le read_email Partie exception de la méthode, ajoutez le code suivant:

logger.error (str (datetime.datetime.now ()) + "- Erreur lors de la lecture du courrier:" + str (e) + "\ n") logger.exception (str (e))

La première ligne enregistre le message d'erreur avec la date et l'heure actuelles dans le fichier journal. La deuxième ligne enregistre la trace de la pile avec l'erreur. 

De même, vous pouvez ajouter le traitement des erreurs à la partie principale du code. Voici à quoi ressemblerait le code avec gestion des erreurs:

try: commits = process_commits () si len (commits) == 0: print "Aucun commits trouvés", sinon: schedule_review_request (commits) sauf Exception, e: print "Une erreur s'est produite. Consultez le journal pour plus de détails. ' logger.error (str (datetime.datetime.now ()) + "- Erreur lors de la lecture du courrier:" + str (e) + "\ n") logger.exception (str (e))

Envelopper

Dans cette partie de la série, vous avez mis en suspens les informations relatives à la demande de révision. reviewer.json fichier. Vous avez également créé une méthode pour lire les emails. Vous utiliserez ces deux fonctions pour donner suite aux demandes de révision de code dans la dernière partie de cette série..

De plus, n'hésitez pas à voir ce que nous avons disponible à la vente et à étudier sur le marché, et n'hésitez pas à poser des questions et à fournir vos précieux commentaires en utilisant le flux ci-dessous.

Le code source de ce tutoriel est disponible sur GitHub.

Faites-nous savoir vos pensées et suggestions dans les commentaires ci-dessous.