[PYTHON] Je pensais que je pouvais créer un bon éditeur gitignore, alors j'ai essayé de faire quelque chose comme MVP pour le moment

Ki: Un petit problème avec .gitignore

Le début de ça

L'une des tâches principales à faire après la «validation initiale» d'un projet est de «créer un joli» .gitignore »à partir de gitignore.io, n'est-ce pas? [^ 1] [^ 2]

** Y a-t-il? ** **

.Gitignore change avec le temps ...

Il n'y a aucun problème s'il peut être utilisé tel quel au début,

  1. Oh, je veux aussi ajouter ignorer pour cet environnement
  2. Il semble qu'un peu d'ignorance spéciale sera nécessaire

Cela peut sortir.

** Il sortira. ** **

Dans le cas (1), vous devrez peut-être accéder à nouveau à gitignore.io et le régénérer.

Dans le cas de (2), je dois l'écrire quelque part dans le ".gitignore" généré par le modèle. Si cela se produit, vous pouvez ressentir des problèmes chaque fois que vous répondez à (1). Peut-être

Acceptation: idées grossières et MVP

Idée

Donc, je me suis demandé si je pouvais faire quelque chose comme "un éditeur qui écrit simplement" nom de la langue "et" ignorer la langue "d'une manière agréable lors de l'édition .gitignore. L'interface utilisateur n'est-elle pas cool comme lazygit?

こんなの

Si vous pouvez le faire, il serait pratique d'ajouter tous les modèles que vous souhaitez ignorer dans la dérivation.

Cela dit, nous n'avons actuellement pas la possibilité de créer des éditeurs dans ce format.

Essayez de faire quelque chose comme ça (= MVP?) Sans aucun tracas

J'ai essayé une implémentation super simple comme MVP. Ici => vigi = vi gitignore

Lorsque vous exécutez la commande vigi,


# ~~~~~~

Ouvrez un fichier comme celui-ci avec vim et

.idea

# ~~~~~~
python
virtualenv

Si vous modifiez comme ceci et quittez vim,

.idea

# ~~~~~~

# https://www.gitignore.io/api/python,Contenu de virtualenv

Cela créera un .gitignore dans un état comme celui-ci.

Au fait, si vous exécutez la commande vigi dans cet état, la partie gitignore.io ne sera une information que pour la langue. Facile à modifier ... je pense.

Tran: Le contenu ressemble à ceci

Un style qui crée un fichier temporaire avec le nom «.gi», le modifie et le convertit en «.gitignore» lorsqu'il est enregistré.

import subprocess
from pathlib import Path
from subprocess import CalledProcessError, PIPE

def main():
    gi_path = Path.cwd() / '.gi'
    gitignore_path = Path.cwd() / '.gitignore'
    try:
        # Convert from ``.gitignore`` to ``.gi``
        if gitignore_path.exists():
            encode_gitignore(gitignore_path, gi_path)
        else:
            with gi_path.open('w') as fp:
                fp.write(dedent(gi_template).strip())
        # Spawn vim
        vim_args = ['/usr/bin/vim', str(gi_path)]
        vim_proc = subprocess.run(vim_args, check=True)
        # Convert from ``.gi`` to ``.gitignore``
        decode_gitignore(gi_path, gitignore_path)
    except CalledProcessError:
        pass
    finally:
        # Remove ``.gi``
        gi_path.unlink()

Appeler vim

Un style approximatif qui appelle vim avec subprocess.run et est OK s'il n'y a pas d'exceptions CalledProcessError. C'est facile et bon.

Ne laissez pas .gi

J'utilise try ~ finally et je jette finalement le fichier .gi. S'il y a une erreur, .gitignore n'est pas édité, il est donc écologique.

Créer .gitignore en fonction du matériau

Le fichier .gi est normalement sur le système de fichiers à ce stade, donc on a l'impression de l'ouvrir comme un fichier normal. Ensuite, rassemblez les informations côté langue et transmettez-les à gitignore.io. Uniquement lorsque l'état HTTP est 404, la réponse est enregistrée comme d'habitude, En effet, tous les cas qui "contiennent des informations qui n'existent pas dans le maître" semblent être 404. C'est la seule chose que l'on puisse dire comme un peu d'ingéniosité.

def decode_gitignore(src, dest):
    custom = []
    online = []
    with src.open() as fp:
        # .Ouvrez le fichier gi et séparez l'avant et l'arrière de la délimitation, etc.
    if online:
        url = f'https://www.gitignore.io/api/{",".join(online)}'
        req = Request(url, None, headers={'User-Agent': 'vigi'})
        try:
            resp = urlopen(req)
            custom.append(resp.read().decode())
        except HTTPError as err:
            if err.code == 404:
                custom.append(resp.read().decode())
            raise err
    with dest.open('w') as fp:
        fp.write('\n'.join(custom))

Conclusion: convivialité

Pour le moment, «.gitignore» dans le projet «vigi» a été créé sur la base de cette commande.

Je pense que c'est un mérite que le nombre de lignes affichées au moment de l'édition soit considérablement réduit. En ce sens, il a bien fait son travail de MVP.

Cependant, je ne sais pas quel type de modèle est inclus dans le master de langue avant d'avoir terminé la conversion en .gitignore. Si je voulais le développer un peu plus, je devais retirer correctement le maître de langue des candidats de modèle. Je ne sais pas si c'est vraiment bon. ~~ Peut-être convient-il pour une formation dans une langue? ~~

[^ 1]: Il existe un modèle de projet, mais oubliez-le. [^ 2]: Vous pouvez le gérer avec dotfiles, mais oubliez cela aussi

Recommended Posts

Je pensais que je pouvais créer un bon éditeur gitignore, alors j'ai essayé de faire quelque chose comme MVP pour le moment
[Salut Py (Partie 1)] Je veux faire quelque chose pour le moment, alors commencez par fixer un objectif.
Je veux créer un Dockerfile pour le moment.
Faire un histogramme pour le moment (matplotlib)
Je veux déplacer le sélénium pour le moment [pour mac]
J'ai essayé d'exécuter PIFuHD sur Windows pour le moment
J'ai créé un éditeur de texte simple en utilisant PyQt
Je veux voir quelque chose de beau, alors j'ai essayé de visualiser la fonction utilisée pour comparer la fonction d'optimisation.
Le programmeur Java a essayé de toucher le langage Go (pour le moment)
[Python] J'ai essayé d'implémenter un tri stable, alors notez
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
Pour le moment, je veux convertir n'importe quel fichier avec ffmpeg !!
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
J'ai essayé tensorflow pour la première fois
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ①
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②
J'ai créé une API Web
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
J'ai essayé de déplacer le modèle 3D en faisant quelque chose comme la capture de mouvement avec juste un ordinateur portable + une caméra Web
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
J'ai acheté Sipeed Lichee Zero alors je l'ai configuré pour le moment
J'ai joué avec Floydhub pour le moment
J'ai essayé la programmation python pour la première fois.
J'ai essayé de faire de l'IA pour Smash Bra
J'ai essayé Mind Meld pour la première fois
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de créer OneHotEncoder, qui est souvent utilisé pour l'analyse des données, afin qu'il puisse atteindre l'endroit qui démange.
J'essaierai de résumer les liens qui me semblent utiles pour le moment
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
C'est le jour du chat, alors j'ai essayé de créer quelque chose qui se traduise par des mots semblables à ceux d'un chat.
J'ai essayé de faire un "putain de gros convertisseur de littérature"
J'ai essayé Python sur Mac pour la première fois.
Mémo de flux pour déplacer LOCUST pour le moment
Simulation de dynamique moléculaire à essayer pour le moment
J'ai essayé python pour la première fois avec heroku
Essayez d'installer Arch Linux pour le moment.
À côté d'Excel, le notebook Jupyter pour le moment
AI Gaming Je l'ai essayé pour la première fois
J'ai essayé de créer une fonction pour juger si les principaux stocks du monde sont l'heure d'été avec python
"Arrêtez de soumettre des fichiers japonais à git sur Mac> <" Pour le moment, j'ai écrit un script pour rechercher des fichiers japonais incompatibles sur Mac et Linux.
J'ai essayé de faire de la vidéo de diffusion Masami comme IPPON Grand Prix (OpenCV: version Python)
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version UserLAnd)
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
Je veux créer un éditeur de blog avec l'administrateur de django
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
J'ai trébuché lorsque j'ai essayé d'installer Basemap, donc un mémorandum
J'ai essayé l'API Google Cloud Vision pour la première fois
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai fait un chronomètre en utilisant tkinter avec python
[Apprentissage de renforcement d'introduction] Renforcement de l'apprentissage pour bouger pour le moment
Je veux ajouter un joli complément à input () en python
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
J'ai essayé de créer un traitement par lots sans serveur pour la première fois avec DynamoDB et Step Functions
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse