Maison >développement back-end >Tutoriel Python >Construire un planificateur de révision de code Python : suivi des révisions

Construire un planificateur de révision de code Python : suivi des révisions

WBOY
WBOYoriginal
2023-08-30 20:09:181115parcourir

Construire un planificateur de révision de code Python : suivi des révisions

Dans la troisième partie de cette série, vous avez appris à enregistrer les informations de demande de révision de code pour un traitement ultérieur. Vous créez une méthode appelée read_email pour recevoir un e-mail de la boîte de réception afin de vérifier si le réviseur a répondu à la demande de révision du code. Vous avez également implémenté la gestion des erreurs dans le code du planificateur de révision de code.

Dans cette partie de la série, vous utiliserez les informations de révision de code enregistrées et les informations de votre courrier électronique pour vérifier si le réviseur a répondu à la demande de révision. Si la demande n’a pas reçu de réponse, vous enverrez un e-mail de suivi au réviseur.

Commencer

Commencez par cloner le code source de la troisième partie de cette série de didacticiels.

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

Modifier config.json 文件以包含一些相关的电子邮件地址,并保留 royagasthyan@gmail.com 电子邮件地址。这是因为 git 具有与此特定电子邮件地址相关的提交,这是代码按预期执行所必需的。修改 schedule.py 文件中的 SMTP Identifiants :

FROM_EMAIL      = "your_email_address@gmail.com"
FROM_PWD        = "your_password"

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 "project_x"

Il doit envoyer la demande de révision du code à un développeur aléatoire pour examen et créer un fichier reviewer.json contenant les informations de révision.

Mettre en œuvre les demandes de suivi

Nous commençons par créer une méthode de demande de suivi nommée followup_request 的后续请求方法。在 followup_request 方法内,读取 reviewer.json. Dans la méthode

, lisez le fichier

et enregistrez le contenu dans une liste. Le code est le suivant : read_email

with open('reviewer.json','r') as jfile:
    review_info = json.load(jfile)

Ensuite, extrayez les informations de courrier électronique en utilisant la méthode

que vous avez implémentée dans le didacticiel précédent. Re:

email_info = read_email(no_days)

Si l'évaluateur a répondu à la demande d'avis, il devrait y avoir un e-mail avec le même sujet et une marque

devant. Alors, parcourez la liste des messages d'avis et comparez le sujet de l'avis au sujet de l'e-mail pour voir si le réviseur a répondu à la demande. review_info

for review in review_info:
    review_replied = false
    expected_subject = 'RE: ' + review['subject']
    for email in email_info:
        if expected_subject == email['subject']:
            review_replied = True
            print 'Reviewer has responded'
            break;

Comme le montre le code ci-dessus, vous parcourez la liste

et vérifiez le sujet du message de commentaire par rapport au sujet de l'e-mail pour voir si le commentateur a répondu. reviewer.json 文件中保留特定的审阅信息。因此,创建一个名为 Delete_Info 的 Python 方法,以从 reviewer.json 文件中删除特定评论信息。以下是 Delete_Info

Désormais, une fois qu'un réviseur répond à une demande de révision de code, vous n'avez plus besoin de conserver des informations de révision spécifiques dans le fichier

. Par conséquent, créez une méthode Python nommée

pour supprimer les informations de commentaire spécifiques du fichier

. Voici à quoi ressemble Delete_Info 方法。调用 Delete_Info 方法时,需要传递 review_info 的副本,以免更改原始信息列表。您将需要原始评论信息列表以供稍后比较。因此导入 copy :

def Delete_Info(info, id):
    for i in xrange(len(info)):
        if info[i]['id'] == id:
            info.pop(i)
            break
    return info

Comme le montre le code ci-dessus, vous avez parcouru la liste des informations de commentaire et supprimé les entrées correspondant à l'ID. Après avoir supprimé les informations du fichier, revenez à la liste. review_info

Lorsque vous répondez à un message de commentaire, vous devez appeler la méthode

. Lors de l'appel de la méthode Delete_Info, vous devez transmettre une copie de

afin de ne pas altérer la liste originale des messages. Vous aurez besoin de la liste originale des informations sur les avis pour une comparaison ultérieure. Importez donc le module Python copy pour créer une copie de la liste originale des messages de commentaires.

from copy import copy
followup_requestCréez une copie de la

liste.

review_info_copy = copy(review_info)
review_info 列表被迭代,您需要检查 reviewer.json 文件中是否有任何更改。如果任何现有评论信息已被删除,您需要相应更新 reviewer.json 文件。因此,检查 review_info_copyreview_info 是否相同,并更新 reviewer.jsonLors de la suppression des informations sur les commentaires répondus de la liste d'origine, transmettez la liste copiée à la méthode

.

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

méthode :

def followup_request():
    with open('reviewer.json','r') as jfile:
        review_info = json.load(jfile)
    review_info_copy = copy(review_info)

    email_info = read_email(no_days)

    for review in review_info:
        review_replied = False
        expected_subject = 'Re: ' + review['subject']
        for email in email_info:
            if expected_subject == email['Subject']:
                review_replied = True
                review_info_copy = Delete_Info(review_info_copy,review['id'])
                break;
followup_requestMaintenant, une fois la liste

itérée, vous devez vérifier s'il y a des changements dans le fichier

. Si des informations de commentaire existantes ont été supprimées, vous devrez mettre à jour votre fichier reviewer.json 文件。现在运行调度程序,以便将代码审查请求发送给随机开发人员。检查该信息是否已保存在 reviewer.json en conséquence. Alors, vérifiez si review_info_copy et

sont identiques et mettez à jour le fichier

. reviewer.json

if review_info_copy != review_info:
    with open('reviewer.json','w') as outfile:
        json.dump(review_info_copy,outfile)

Voici la méthode 🎜 complète : 🎜
def followup_request():
    with open('reviewer.json','r') as jfile:
        review_info = json.load(jfile)
    review_info_copy = copy(review_info)

    email_info = read_email(no_days)

    for review in review_info:
        review_replied = False
        expected_subject = 'Re: ' + review['subject']
        for email in email_info:
            if expected_subject == email['Subject']:
                review_replied = True
                review_info_copy = Delete_Info(review_info_copy,review['id'])
                break;

    if review_info_copy != review_info:
        with open('reviewer.json','w') as outfile:
            json.dump(review_info_copy,outfile)
🎜Appelez la méthode 🎜 pour donner suite à une demande d'avis envoyée. 🎜
try:
    commits = process_commits()

    # Added the follow Up Method
    followup_request()

    if len(commits) == 0:
        print 'No commits found '
    else:
        schedule_review_request(commits)

except Exception,e:
    print 'Error occurred. Check log for details.'
    logger.error(str(datetime.datetime.now()) + " - Error occurred : " + str(e) + "\n")
    logger.exception(str(e))
🎜Enregistrez les modifications ci-dessus. Afin de tester les fonctionnalités ultérieures, veuillez supprimer le fichier 🎜 du répertoire du projet. Exécutez maintenant le planificateur pour envoyer des demandes de révision de code à des développeurs aléatoires. Vérifiez si les informations ont été enregistrées dans le fichier 🎜. 🎜 🎜Exiger des développeurs spécifiques qu'ils répondent aux demandes de révision de code en répondant aux e-mails. Maintenant, exécutez à nouveau le planificateur et cette fois, le planificateur devrait être capable de trouver la réponse et de la supprimer du fichier 🎜. 🎜

发送提醒电子邮件

审核者回复代码审核请求电子邮件后,需要从 reviewer.json 文件中删除该信息,因为您不需要进一步跟踪它。如果审核者尚未回复代码审核请求,您需要发送后续邮件提醒他或她审核请求。

代码审查调度程序将每天运行。当它运行时,您首先需要检查开发人员响应审核请求是否已经过去了一定时间。在项目配置中,您可以设置一个审核周期,在此期间,如果审核者没有回复,调度程序将发送提醒电子邮件。

让我们首先在项目配置中添加配置。在配置文件中添加一个名为 followup_Frequency 的新配置。

{
    "name": "project_x",
    "git_url": "https://github.com/royagasthyan/project_x",
    "followup_frequency":2,
    "members": [
        "royagasthyan@gmail.com",
    	"samon@gmail.com",
    	"sualonni@gmail.com",
    	"restuni@gmail.com"
    ]
}

因此,当审阅者在 followup_Frequency 天数内没有回复时,您将发送一封提醒电子邮件。读取配置的同时将配置读入全局变量:

for p in main_config:
    if p['name'] == project:
        project_url = p['git_url']
        project_members = p['members']
        followup_frequency = p['followup_frequency']
    break

followup_request 方法内部,当审稿人在 followup_frequest 天数内没有回复后续请求时,发送提醒邮件。计算自评论发送以来的天数。

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

如果天数大于配置中的后续频率日期,请发送提醒电子邮件。

if not review_replied:
    if days_since_review > followup_frequency:
        send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n')

这是完整的 followup_request 方法:

def followup_request():
    with open('reviewer.json','r') as jfile:
        review_info = json.load(jfile)
    review_info_copy = copy(review_info)

    email_info = read_email(no_days)

    for review in review_info:
        review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d')
        today = datetime.datetime.today()
        days_since_review = (today - review_date).days
        review_replied = False
        expected_subject = 'Re: ' + review['subject']
        for email in email_info:
            if expected_subject == email['Subject']:
                review_replied = True
                review_info_copy = Delete_Info(review_info_copy,review['id'])
                break;

        if not review_replied:
            if days_since_review > followup_frequency:
                send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n')

    if review_info_copy != review_info:
        with open('reviewer.json','w') as outfile:
            json.dump(review_info_copy,outfile)

总结

在本教程中,您了解了如何实现跟进代码审核请求的逻辑。您还添加了如果审阅者在一定天数内没有回复电子邮件的情况下发送提醒电子邮件的功能。

这个 Python 代码审查器可以进一步增强以满足您的需求。请分叉存储库并添加新功能,并在下面的评论中告诉我们。

本教程的源代码可在 GitHub 上获取。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn