Nettoyage du backlog avec Python

Objectif

J'ai utilisé l 'API publique de Python pour organiser le Backlog. En tant que mémorandum.

De côté

Si vous le remarquez, c'est la fin de l'année. Dans le fil de l'histoire, l'endroit où je suis en charge du nettoyage est Backlog. Nous avons de nombreux systèmes de gestion des problèmes auxquels nous sommes redevables au quotidien.

Ce que je voulais faire

Automatisation du processus d'extraction des tickets de problème pour le personnel non affecté et affectation de nouveau personnel. Puisqu'il n'est pas possible d'en disposer subjectivement, tout d'abord, afin de clarifier la responsabilité, j'ai décidé de désigner un responsable. En un coup d'œil, il existe des dizaines de tickets pour lesquels le responsable n'a pas été défini, et il est jugé difficile de les insérer manuellement. Je veux le faire automatiquement à l'aide d'un outil.

Commentaire de la source

Paramètres de commande

setup.py


from setuptools import setup

setup(
    name='',
    version='1.0.0',
    author='Le nom de la personne qui l'a fait',
    author_email='adresse e-mail de contact',
    install_requires=[
        'requests==2.11.1',
        'docopt==0.6.2'
    ],
    entry_points="""\    #←←←←←←←← Ceci!!!!!!!!!!!!
      [console_scripts]
      wariate = update_assignee_id:main
      """,
)

setup.py possède de nombreuses fonctionnalités utiles, dont entry_points. C'est la même chose que pserve dans setup.py de Pyramid, ce qui vous évite d'avoir à exécuter des commandes python. C'est petit, mais c'est utile lorsque le nom du fichier python est long ou que la hiérarchie est profonde.

Exemple) Si vous souhaitez exécuter l'outil sans définir entry_points, activez-le d'abord

(venv)python /User/tool/backlog/update_assignee_id.py --api-key=uiwejaefdhpasid8fpa8etw3to

Si vous exécutez l'outil avec entry_points défini, activez-le d'abord (venv)wariate --api-key=uiwejaefdhpasid8fpa8etw3to

Analyseur facultatif

update_assignee_id.py


"""execute update assignee id

usage: wariate (--api-key=<api-key>)

options:
    --api-key=<api-key>     api key
"""

from docopt import docopt

def main():
    args = docopt(__doc__)
    update_assignee_id(args['--api-key'])

Prenez uniquement le document au début du fichier Python et la fonction principale. Si vous l'écrivez ainsi, il vérifiera les arguments requis. Il existe Autres fonctions utiles, vous devriez donc les utiliser. Contrairement à d'autres analyseurs, il fait référence au document, c'est donc aussi un avantage que vous pouvez éviter la situation où seul le document n'est pas maintenu.

Exécution de l'API

update_assignee_id.py



import json
import requests

__API_KEY = '?apiKey={}'
__BASE_END_POINT = 'https://domein.backlog.jp/api/v2/'
__PROJECT_END_POINT = __BASE_END_POINT + 'projects'

def get_project_ids(api_key):
    r = requests.get(__PROJECT_END_POINT + __API_KEY.format(api_key))
    projects = json.loads(r.text)
    return list(map(lambda project: project['id'], projects))

Prenez la pièce pour obtenir la liste des ID de projet. Après tout, requests est un push, et il est facile de l'utiliser comme une source intuitive pour la lecture humaine. À propos, cette source a été confirmée pour fonctionner avec Python 3.5. Dans le cas de la série Python2, je pense que le type de retour de la fonction de carte était une liste, donc dans le cas de la série 2, je pense que la conversion de type en liste n'était pas nécessaire. Peut-être.

Récupérer les enregistrements qui n'ont pas été établis par le responsable

update_assignee_id.py



__GET_ISSUE_QUERY = {
    'statusId[]': [1, 2, 3],
    'sort': 'assignee',
    'order': 'asc'
}
__ISSUE_END_POINT = __BASE_END_POINT + 'issues'

def get_issues(api_key, project_ids):
    is_continue = True
    params = __GET_ISSUE_QUERY
    params['projectId[]'] = project_ids
    while is_continue:
        r = requests.get(__ISSUE_END_POINT + __API_KEY.format(api_key), params=params)
        issues = json.loads(r.text)
        for issue in issues:
            if issue['assignee'] is None:
                yield issue
            else:
                is_continue = False
                break

Il est possible d'obtenir une liste de problèmes en spécifiant une personne spécifique en charge, mais la personne en charge ne peut pas intentionnellement ramasser un problème non réglé (spécification API). Par conséquent, je n'ai pas osé restreindre le nom de la personne responsable, mais j'ai trié la personne responsable par ordre croissant et j'ai répondu en soulevant les questions pour lesquelles la personne responsable n'avait pas été définie en premier.

Qu'est-ce que le patch

update_assignee_id.py



def update_issue(issue, api_key):
    base_url = '/'.join([__ISSUE_END_POINT, issue['issueKey']]) + __API_KEY.format(api_key)
    params = {
        'assigneeId': issue['createdUser']['id']
    }
    r = requests.patch(base_url, params)
    if r.status_code != 200:
        raise Exception('update error occurred:{}'.format(issue['issueKey']))
    print('updated:{}'.format(issue['issueKey']))


En faisant cela, le responsable peut être mis à jour par le créateur. J'ai honte de connaître la catégorie de requête appelée patch pour la première fois. Comme une bonne utilisation avec la poste post → mise à jour complète patch → Partiellement mis à jour Il semble. J'ai appris quelque chose.

finalement

Si vous êtes intéressé par une telle entreprise, nous vous serions reconnaissants de bien vouloir nous contacter depuis en bas de la page d'accueil de notre blog ingénieur de Qiita. Nous avons hâte de!

Recommended Posts

Nettoyage du backlog avec Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Nettoyage des données à l'aide de Python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python
Exécutez Blender avec python
Résoudre des maths avec Python
Python à partir de Windows 7
Carte thermique par Python + matplotlib
Multi-processus de manière asynchrone avec python