From 083069d81291a4e4f4afabd5f141c33c1bfd4ecf Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Thu, 21 Apr 2022 21:07:42 +0200 Subject: [PATCH] Create external tools --- asciidoc-to-tex.tex | 115 --------------------------- chapters/python.tex | 180 +++++++++++++++++++++++++++++++++++++++--- parts/environment.tex | 47 ++++------- 3 files changed, 183 insertions(+), 159 deletions(-) diff --git a/asciidoc-to-tex.tex b/asciidoc-to-tex.tex index b958ca2..4087712 100644 --- a/asciidoc-to-tex.tex +++ b/asciidoc-to-tex.tex @@ -88,133 +88,18 @@ \end{Highlighting} \end{Shaded} -←-\/- / partie obsolète -\/-→ - -Ceci vous affichera non seulement la couverture de code estimée, et -générera également vos fichiers sources avec les branches non couvertes. - - - -\hypertarget{_configuration_globale}{% -\subsubsection{Configuration globale}\label{_configuration_globale}} - -Décrire le fichier setup.cfg - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\FunctionTok{touch}\NormalTok{ setup.cfg} -\end{Highlighting} -\end{Shaded} - \hypertarget{_dockerfile}{% \subsubsection{Dockerfile}\label{_dockerfile}} \begin{verbatim} -# Dockerfile - -# Pull base image -#FROM python:3.8 -FROM python:3.8-slim-buster - -# Set environment variables -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 -ENV DEBIAN_FRONTEND noninteractive -ENV ACCEPT_EULA=Y - -# install Microsoft SQL Server requirements. -ENV ACCEPT_EULA=Y -RUN apt-get update -y && apt-get update \ - && apt-get install -y --no-install-recommends curl gcc g++ gnupg - - -# Add SQL Server ODBC Driver 17 -RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - -RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list -RUN apt-get update \ - && apt-get install -y msodbcsql17 unixodbc-dev - -# clean the install. -RUN apt-get -y clean - -# Set work directory -WORKDIR /code - -# Install dependencies -COPY ./requirements/base.txt /code/requirements/ -RUN pip install --upgrade pip -RUN pip install -r ./requirements/base.txt - -# Copy project -COPY . /code/ \end{verbatim} \hypertarget{_makefile}{% \subsubsection{Makefile}\label{_makefile}} -Pour gagner un peu de temps, n'hésitez pas à créer un fichier -\texttt{Makefile} que vous placerez à la racine du projet. L'exemple -ci-dessous permettra, grâce à la commande \texttt{make\ coverage}, -d'arriver au même résultat que ci-dessus: -\begin{verbatim} -# Makefile for gwift -# -# User-friendly check for coverage -ifeq ($(shell which coverage >/dev/null 2>&1; echo $$?), 1) - $(error The 'coverage' command was not found. Make sure you have coverage installed) -endif -.PHONY: help coverage - -help: - @echo " coverage to run coverage check of the source files." - -coverage: - coverage run --source='.' manage.py test; coverage report; coverage html; - @echo "Testing of coverage in the sources finished." -\end{verbatim} - -Pour la petite histoire, \texttt{make} peu sembler un peu désuet, mais -reste extrêmement efficace. - -\hypertarget{_environnement_de_duxe9veloppement}{% -\subsection{Environnement de -développement}\label{_environnement_de_duxe9veloppement}} - -Concrètement, nous pourrions tout à fait nous limiter à Notepad ou -Notepad++. Mais à moins d'aimer se fouetter avec un câble USB, nous -apprécions la complétion du code, la coloration syntaxique, -l'intégration des tests unitaires et d'un debugger, ainsi que deux-trois -sucreries qui feront plaisir à n'importe quel développeur. - -Si vous manquez d'idées ou si vous ne savez pas par où commencer: - -\begin{itemize} -\item - \href{https://vscodium.com/}{VSCodium}, avec les plugins - \href{https://marketplace.visualstudio.com/items?itemName=ms-python.python}{Python}et - \href{https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens}{GitLens} -\item - \href{https://www.jetbrains.com/pycharm/}{PyCharm} -\item - \href{https://www.vim.org/}{Vim} avec les plugins - \href{https://github.com/davidhalter/jedi-vim}{Jedi-Vim} et - \href{https://github.com/preservim/nerdtree}{nerdtree} -\end{itemize} - -Si vous hésitez, et même si Codium n'est pas le plus léger (la faute à -\href{https://www.electronjs.org/}{Electron}\ldots\hspace{0pt}), il fera -correctement son travail (à savoir: faciliter le vôtre), en intégrant -suffisament de fonctionnalités qui gâteront les papilles émoustillées du -développeur impatient. - -\begin{figure} -\centering -\includegraphics{images/environment/codium.png} -\caption{Codium en action} -\end{figure} \hypertarget{_un_terminal}{% \subsection{Un terminal}\label{_un_terminal}} diff --git a/chapters/python.tex b/chapters/python.tex index b29cf9b..326ccf5 100644 --- a/chapters/python.tex +++ b/chapters/python.tex @@ -651,19 +651,11 @@ Pour nous en assurer (dès fois que quelqu'un en doute), il nous suffit de déma \subsection{Couverture de code} +Avec \texttt{pytest}, il convient d'utiliser le paquet \href{https://pypi.org/project/pytest-cov/}{\texttt{pytest-cov}}, suivi de la commande \texttt{pytest\ -\/-cov=gwift\ tests/}. -Avec \texttt{pytest}, il convient d'utiliser le paquet -\href{https://pypi.org/project/pytest-cov/}{\texttt{pytest-cov}}, suivi -de la commande \texttt{pytest\ -\/-cov=gwift\ tests/}. - -Si vous préférez rester avec le cadre de tests de Django, vous pouvez -passer par le paquet -\href{https://pypi.org/project/django-coverage-plugin/}{django-coverage-plugin} -Ajoutez-le dans le fichier \texttt{requirements/base.txt}, et lancez une -couverture de code grâce à la commande \texttt{coverage}. La -configuration peut se faire dans un fichier \texttt{.coveragerc} que -vous placerez à la racine de votre projet, et qui sera lu lors de -l'exécution. +Si vous préférez rester avec le cadre de tests de Django, vous pouvez passer par le paquet\href{https://pypi.org/project/django-coverage-plugin/}{django-coverage-plugin}. +Ajoutez-le dans le fichier \texttt{requirements/base.txt}, et lancez une couverture de code grâce à la commande \texttt{coverage}. +La configuration peut se faire dans un fichier \texttt{.coveragerc} que vous placerez à la racine de votre projet, et qui sera lu lors de l'exécution. \section{Matrice de compatibilité} @@ -699,6 +691,170 @@ Ci-dessus, la commande retournera une erreur pour chaque version non trouvée, a TODO: Intérêt des containers. +\section{Glue de configuration} + +Décrire le fichier setup.cfg. + +\section{Docker \& Dockerfile} + +\begin{listing} + \begin{verbatim} + # Dockerfile + + # Pull base image + FROM python:3.8-slim-buster + + # Set environment variables + ENV PYTHONDONTWRITEBYTECODE 1 + ENV PYTHONUNBUFFERED 1 + ENV DEBIAN_FRONTEND noninteractive + ENV ACCEPT_EULA=Y + + # install Microsoft SQL Server requirements. + ENV ACCEPT_EULA=Y + RUN apt-get update -y && apt-get update \ + && apt-get install -y --no-install-recommends curl gcc g++ gnupg + + + # Add SQL Server ODBC Driver 17 + RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - + RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list + RUN apt-get update \ + && apt-get install -y msodbcsql17 unixodbc-dev + + # clean the install. + RUN apt-get -y clean + + # Set work directory + WORKDIR /code + + # Install dependencies + COPY ./requirements/base.txt /code/requirements/ + RUN pip install --upgrade pip + RUN pip install -r ./requirements/base.txt + + # Copy project + COPY . /code/ + + \end{verbatim} + \caption{Un exemple de Dockerfile} +\end{listing} + +\section{Makefile} + +Pour gagner un peu de temps, n'hésitez pas à créer un fichier \texttt{Makefile} que vous placerez à la racine du projet. +L'exemple ci-dessous permettra, grâce à la commande \texttt{make\ coverage}, d'arriver au même résultat que ci-dessus: + +\begin{listing} +\begin{verbatim} + # Makefile for gwift + # + + # User-friendly check for coverage + ifeq ($(shell which coverage >/dev/null 2>&1; echo $$?), 1) + $(error The 'coverage' command was not found. Make sure you have coverage installed) + endif + + .PHONY: help coverage + + help: + @echo " coverage to run coverage check of the source files." + + coverage: + coverage run --source='.' manage.py test; coverage report; coverage html; + @echo "Testing of coverage in the sources finished." +\end{verbatim} +\caption{Un exemple de fichier Makefile} +\end{listing} + +Pour la petite histoire, \texttt{make} peu sembler un peu désuet, mais +reste extrêmement efficace. + +\section{Outils de développement} + +\subsection{Environnement de développement} + +Concrètement, nous pourrions tout à fait nous limiter à Notepad ou Notepad++. +Mais à moins d'aimer se fouetter avec un câble USB, nous apprécions la complétion du code, la coloration syntaxique, l'intégration des tests unitaires et d'un debugger, ainsi que deux-trois sucreries qui feront plaisir à n'importe quel développeur. + +Si vous manquez d'idées ou si vous ne savez pas par où commencer: + +\begin{itemize} +\item + \href{https://vscodium.com/}{VSCodium}, avec les plugins + \href{https://marketplace.visualstudio.com/items?itemName=ms-python.python}{Python}et + \href{https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens}{GitLens} +\item + \href{https://www.jetbrains.com/pycharm/}{PyCharm} +\item + \href{https://www.vim.org/}{Vim} avec les plugins + \href{https://github.com/davidhalter/jedi-vim}{Jedi-Vim} et + \href{https://github.com/preservim/nerdtree}{nerdtree} +\end{itemize} + +Si vous hésitez, et même si Codium n'est pas le plus léger (la faute à +\href{https://www.electronjs.org/}{Electron}\ldots\hspace{0pt}), il fera +correctement son travail (à savoir: faciliter le vôtre), en intégrant +suffisament de fonctionnalités qui gâteront les papilles émoustillées du +développeur impatient. + +\begin{figure} + \centering + \includegraphics{images/environment/codium.png} + \caption{Codium en action} +\end{figure} + +\subsection{Terminal} + +\emph{A priori}, les IDE \footnote{Integrated Development Environment} +proposés ci-dessus fournissent par défaut ou \emph{via} des greffons un +terminal intégré. Ceci dit, disposer d'un terminal séparé facilite +parfois certaines tâches. + +A nouveau, si vous manquez d'idées: + +\begin{enumerate} +\item + Si vous êtes sous Windows, téléchargez une copie de + \href{https://cmder.net/}{Cmder}. Il n'est pas le plus rapide, mais + propose une intégration des outils Unix communs (\texttt{ls}, + \texttt{pwd}, \texttt{grep}, \texttt{ssh}, \texttt{git}, + \ldots\hspace{0pt}) sans trop se fouler. +\item + Pour tout autre système, vous devriez disposer en natif de ce qu'il + faut. +\end{enumerate} + +\begin{figure} + \centering + \includegraphics{images/environment/terminal.png} + \caption{Mise en abîme} +\end{figure} + +\subsection{Un gestionnaire de base de données} + +Django gère plusieurs moteurs de base de données. +Certains sont gérés nativement par Django (PostgreSQL, MariaDB, SQLite); \emph{a priori}, ces trois-là sont disponibles pour tous les systèmes d'exploitation. +D'autres moteurs nécessitent des librairies tierces (Oracle, Microsoft SQL Server). + +Il n'est pas obligatoire de disposer d'une application de gestion pour ces moteurs: pour les cas d'utilisation simples, le shell Django pourra largement suffire (nous y reviendrons). +Mais pour faciliter la gestion des bases de données elles-même, et si vous n'êtes pas à l'aise avec la +ligne de commande, choisissez l'une des applications d'administration +ci-dessous en fonction du moteur de base de données que vous souhaitez +utiliser. + +\begin{itemize} +\item + Pour \textbf{PostgreSQL}, il existe + \href{https://www.pgadmin.org/}{pgAdmin} +\item + Pour \textbf{MariaDB} ou \textbf{MySQL}, partez sur + \href{https://www.phpmyadmin.net/}{PHPMyAdmin} +\item + Pour \textbf{SQLite}, il existe + \href{https://sqlitebrowser.org/}{SQLiteBrowser} PHPMyAdmin ou + PgAdmin. +\end{itemize} \section{Conclusions (et intégration continue)} diff --git a/parts/environment.tex b/parts/environment.tex index 5355aed..8153844 100644 --- a/parts/environment.tex +++ b/parts/environment.tex @@ -6,46 +6,29 @@ Make it work, make it right, make it fast --- Kent Beck \end{quote} -En fonction de vos connaissances et compétences, la création d'une -nouvelle application est uneé tape relativement facile à mettre en -place. Le code qui permet de faire tourner cette application peut ne pas -être élégant, voire buggé jusqu'à la moëlle, il pourra fonctionner et -faire "preuve de concept". +En fonction de vos connaissances et compétences, la création d'une nouvelle application est une étape relativement facile à mettre en place. +Le code qui permet de faire tourner cette application peut ne pas être élégant, voire buggé jusqu'à la moëlle, il pourra fonctionner et faire "preuve de concept". -Les problèmes arriveront lorsqu'une nouvelle demande sera introduite, -lorsqu'un bug sera découvert et devra être corrigé ou lorsqu'une -dépendance cessera de fonctionner ou d'être disponible. Or, une -application qui n'évolue pas, meurt. Tout application est donc destinée, -soit à être modifiée, corrigée et suivie, soit à déperrir et à être -délaissée par ses utilisateurs. Et c'est juste cette maintenance qui est -difficile. +Les problèmes arriveront lorsqu'une nouvelle demande sera introduite, lorsqu'un bug sera découvert et devra être corrigé ou lorsqu'une dépendance cessera de fonctionner ou d'être disponible. +Or, une application qui n'évolue pas, meurt. +Toute application est donc destinée, soit à être modifiée, corrigée et suivie, soit à déperrir et à être +délaissée par ses utilisateurs. +Et c'est juste cette maintenance qui est difficile. -L'application des principes présentés et agrégés ci-dessous permet -surtout de préparer correctement tout ce qui pourra arriver, sans aller -jusqu'au « \textbf{You Ain't Gonna Need It} » (ou \textbf{YAGNI\index{YAGNI}}), qui -consiste à surcharger tout développement avec des fonctionnalités non -demandées, juste « au cas ou ». Pour paraphraser une partie de -l'introduction du livre \emph{Clean Architecture} -\cite{clean_architecture}: +L'application des principes présentés et agrégés ci-dessous permet surtout de préparer correctement tout ce qui pourra arriver, sans aller jusqu'au « \textbf{You Ain't Gonna Need It} » (ou \textbf{YAGNI\index{YAGNI}}), qui consiste à surcharger tout développement avec des fonctionnalités non demandées, juste « au cas ou ». +Pour paraphraser une partie de l'introduction du livre \emph{Clean Architecture} \cite{clean_architecture}: \begin{quote} -Getting software right is hard: it takes knowledge and skills that most -young programmers don't take the time to develop. It requires a level of -discipline and dedication that most programmers never dreamed they'd -need. Mostly, it takes a passion for the craft and the desire to be a -professional. +Getting software right is hard: it takes knowledge and skills that most young programmers don't take the time to develop. +It requires a level of discipline and dedication that most programmers never dreamed they'd need. +Mostly, it takes a passion for the craft and the desire to be a professional. --- Robert C. Martin Clean Architecture \end{quote} -Le développement d'un logiciel nécessite une rigueur d'exécution et des -connaissances précises dans des domaines extrêmement variés. Il -nécessite également des intentions, des (bonnes) décisions et énormément -d'attention. Indépendamment de l'architecture que vous aurez choisie, -des technologies que vous aurez patiemment évaluées et mises en place, -une architecture et une solution peuvent être cassées en un instant, en -même temps que tout ce que vous aurez construit, dès que vous en aurez -détourné le regard. +Le développement d'un logiciel nécessite une rigueur d'exécution et des connaissances précises dans des domaines extrêmement variés. +Il nécessite également des intentions, des (bonnes) décisions et énormément d'attention. +Indépendamment de l'architecture que vous aurez choisie, des technologies que vous aurez patiemment évaluées et mises en place, une architecture et une solution peuvent être cassées en un instant, en même temps que tout ce que vous aurez construit, dès que vous en aurez détourné le regard. Un des objectifs ici est de placer les barrières et les gardes-fous (ou plutôt, les "\textbf{garde-vous}"), afin de péréniser au maximum les