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