Application Point Médian – Behind the scenes !

Objectifs de cet atelier

  • Partager le parcours de création de l’application Point Médian
  • Présenter le coeur du logiciel
  • Présenter la création de l’interface
  • Présenter quelques technologies qui permettent d’itérer super rapidement (DevOps)

Parcours de création

  • Un besoin: Utiliser le point médian dans l’écriture inclusive
  • Un problème: Pas évident à faire sur le clavier
  • Première solution: Une fonction Python pour convertir un texte que j’avais déjà en main

Améliorations

  • Faire une application web pour PC avec Flask
  • Déployer l’application dans un Docker
  • Déployer le docker sur CapRover
  • Automatiser la compilation du docker sur GitLab avec Docker in Docker
  • Automatiser le déploiement sur CapRover
  • Faire des tests unitaires avec Python pour éviter les régressions

Constats

  • Progression successive
  • Maintenant
  • une mise à jour de mon code passe en production en moins de 3 minutes
  • de manière entièrement automatique.
  • Voici les outils que j’ai utilisés
  • PyCharm IDE
  • Flask et Bootstrap pour l’application web
  • Docker, GitLab et CapRover pour le déploiement

Intellij IDEA ou PyCharm

  • Environnement de développement gratuit
  • Utile pour de nombreux langages de programmation
  • La version commerciale offre davantage de modules et d’options de collaboration
Capture d'écran de PyCharm

Coeur du de l’application point-median: Expression régulière

  • Le coeur du logiciel est une fonction qui utilise les expressions régulières.
  • Souvent appelées Regex
  • Permettent de représenter des motifs de texte et de les extraire

Exemple avec deux groupes

(teur[s]?)[.\-/]([t]?rice[s]?)
Exemple d'expression régulière avec deux groupes

Exemple avec trois groupes

  • Voici comment la visualiser avec un diagramme « chemin de fer »
  • https://regexper.com/
(teur)[.\-/](trice)[.\-/]([s]+)
Exemple d'expression régulière avec trois groupes

Création de l’interface avec Flask et Bootstrap

Flask

  • Flask est un module Python qui permet de faire des applications web simples
  • Il consiste en trois parties:
  • du contenu web, comme des pages HTML, des scripts Javascript, des fichiers CSS et des images
  • des templates Jinja2, qui sont des fonctions Python pour du contenu dynamique dans les pages
  • Un script python utilisant des décorateurs pour indiquer les pages web

Illustrons ça

Architecture de l'application point-median

Code HTML du formulaire

Voici le code HTML du formulaire de saisir

<div class="container">
<form class="form-inline">
    <div class="form-group">
        <label class="sr-only" for="texte_input">Texte en
            entrée</label><br>
        <textarea id="texte_input" class="form-control" name="texte_input"></textarea>
    </div>
    <br>
    <div class="form-group">
        <button type="submit" class="btn btn-primary">Convertir</button>
    </div>
</form>
</div>

Bootstrap

  • Afin de rendre l’application adaptative sur mobile, j’ai utilisé Bootstrap, un outil Javascript/CSS
  • On voit ici un exemple de templates Jinja2 entre les accolades {{ }}

Exemple:

<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>

Exemple de Bootstrap: barre de navigation

Voici un exemple de composants tirée de la librairie Bootstrap: la barre de navigation

<nav class="navbar navbar-toggleable-md navbar-inverse bg-light">
    <div class="container">
        <h1>Convertisseur point médian</h1>
    </div>
</nav>

Rendre l’application dynamique: JQuery

JQuery permet d’écrire des fonctions pour rendre l’application dynamique. Comme ça, elle ne se recharge pas à chaque fois qu’on convertit un texte.

$(document).ready(function () {
    $('form').on('submit', function (event) {
        $.ajax({
            data: {
                texte_input: $('#texte_input').val(),
            },
            type: 'POST',
            url: '/point_median'
        })
            .done(function (data) {
                $('textarea#output').
                val(data.texte_output).show();
            });
        event.preventDefault();
    });
});

Fonction appelée

Cette fonction est appelé lorsque le bouton est cliqué.

@app.route('/point_median', methods=['POST'])
def call_convertir_point_median():
    texte = request.form['texte_input']
    # Règles à 3 composantes
    texte_output = convertir_point_median(texte)
    return jsonify({'texte_output': texte_output})

Docker

  • Docker est une plateforme qui utilise le noyau Linux et des conteneurs d’applications pour exécuter des applications orientées serveur sur n’importe quel système basé sur Linux.

Dockerfile

  • Le Dockerfile permet de prendre une image existante et d’y mettre notre application pour créer une nouvelle image.
FROM python:3.10.5-slim-buster

WORKDIR /python-docker

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY templates templates
COPY app.py app.py
COPY static static

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

CapRover

  • CapRover est une plateforme de type PaaS qui permet de gérer simplement des applications utilisant Docker.

PaaS

  • Le PaaS est un modèle d’infonuagique où le client gère les données et l’application, mais pas le reste.

DevOps

Le DevOps est une technique de développement logiciel qui permet d’accélérer le cycle de développement en utilisant de l’automatisation et de déploiement en continu par la même équipe.

GitLab

L’environnement GitLab est un logiciel en ligne qui permet la gestion de code source et la gestion de projets de développement, incluant toute la partie intégration et déploiement en continu (CI/CD) et le DevOps.

GitLab CI/CD

  • Tout se passe dans le fichier .gitlab-ci.yml
  • On définit les différentes étapes pour publier l’application
stages:
  - test
  - dockerize

Étape du test

  • Je vais maintenant te montrer l’étape de test, on pourra voir le contenu du fichier .gitlab-ci.yml

Tests unitaires

  • Un test unitaire permet de tester un scénario de l’application et s’assurer que le bon résultat est obtenu
  • Voici un exemple:
assert convertir_point_median("invité.e") == "invité·e"

Contenu du fichier .gitlab-ci.yml pour l’étape de test

test-cases:
  stage: test
  image: python:3
  before_script:
    - pip install -r requirements.txt
  script:
    - pytest test.py

Git

  • Pour orchestrer tout ce beau travail, j’utilise git, un gestionnaire de code source.
  • Pour envoyer le travail au serveur, j’utilise ces deux commandes. Le serveur s’occupe ensuite de faire le reste et de rendre l’application disponible
git commit -m "voici des modifications"
git push origin main

DéconstruIT ⛏️🧱

Mastermind techno rebelle

Un accompagnement de six mois pour enfin réaliser tes projets technos tout en développant ton autonomie.

Libérons ensemble ton entreprise, ta clientèle et toi de l’oppression numérique.

Travaillons de manière durable et alignée sur tes valeurs dans un environnement sécuritaire, intime et engagé.

Tout en ayant bien du fun !

Ressources