PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Templates de projet avec cookiecutter 8

jeudi 11 juin 2015 à 23:49

Beaucoup de frameworks viennent avec des templates de projets maintenant. Django vient avec django-admin startproject --template, tandis que crossbar vient avec crossbar init --template. L’idée d’avoir de templates pour ses projets n’a rien de nouveau, d’ailleurs la plupart des OS modernes ont au moins ça intégré pour des fichiers. Ainsi Ubuntu à un dossière “Modèles”, et tout ce qu’il y a dedans peut être dupliqué ailleurs via un clic droit dans Nautilus.

Néanmoins la meilleure solution à ce jour vient de Audrey Roy, qui est avant tout connue pour avoir co-écrit le livre Two scoops of Django, et qui a aussi pondu cookiecutter.

L’outil est très simple. D’abord un pip pour l’installer :

pip install cookiecutter

Notez que bien que le projet soit en Python, les templates peuvent être en n’importe quel langage, cookiecutter s’en branle. Lui, il va juste copier le contenu du template dans un dossier, et remplacer les variables notées {{}} dedans.

Pour commencer, on créé un dossier nommé {{cookiecutter.repo_name}} qui va contenir le template de son projet. Oui, le nom du dossier est {{cookiecutter.repo_name}}. En effet les noms de dossiers et fichiers sont aussi templatisables, et passés à la moulinette de jinja2.

Dans ce dossier, on peut mettre tous les fichiers qu’on veut, avec des noms normaux, ou avec des variables. Le contenu des fichiers peut, bien entendu, contenir aussi des variables. Les variables sont toujours de la forme {{cookiecutter.nom_de_variable}}.

Ensuite, à côté de notre dossier nommé {{cookiecutter.repo_name}} (le dossier du template), on peut créer un fichier cookiecutter.json qui va contenir les valeurs par défaut de nos variables :

{
    "repo_name": "nouveau_projet",
    "version": "0.1.0",
    "autre_variable": "Bidule"
}

Enfin pour récolter les fruits de son labeur, on lance cookiecutter /chemin/vers/template et l’outil va vous poser tout un tas de question pour remplir les variables, puis va générer le nouveau projet dans le dossier courant.

Cookiecutter accepte aussi des urls de repo git et mercurial comme source de template, et l’auteur de l’outil fournit un template de projet Python très complet par ce biais.

On va l’utiliser comme exemple.

Voici son contenu :

├── cookiecutter.json <= valeur par défaut des variables
├── {{cookiecutter.repo_name}} <= template du projet
│   ├── AUTHORS.rst
│   ├── CONTRIBUTING.rst
│   ├── {{cookiecutter.repo_name}}
│   │   ├── {{cookiecutter.repo_name}}.py
│   │   └── __init__.py
│   ├── docs
│   │   ├── authors.rst
│   │   ├── conf.py
│   │   ├── contributing.rst
│   │   ├── history.rst
│   │   ├── index.rst
│   │   ├── installation.rst
│   │   ├── make.bat
│   │   ├── Makefile
│   │   ├── readme.rst
│   │   └── usage.rst
│   ├── HISTORY.rst
│   ├── LICENSE
│   ├── Makefile
│   ├── MANIFEST.in
│   ├── README.rst
│   ├── requirements.txt
│   ├── setup.cfg
│   ├── setup.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_{{cookiecutter.repo_name}}.py
│   └── tox.ini
└── README.rst

Certains usages de variables sont assez évident, comme par exemple le fichier __init__:

# -*- coding: utf-8 -*-
 
__author__ = '{{ cookiecutter.full_name }}'
__email__ = '{{ cookiecutter.email }}'
__version__ = '{{ cookiecutter.version }}'

D'autres sont assez malines et inattendues comme le fichier de test :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
test_{{ cookiecutter.repo_name }}
----------------------------------
Tests for `{{ cookiecutter.repo_name }}` module.
"""
 
import unittest
 
from {{ cookiecutter.repo_name }} import {{ cookiecutter.repo_name }}
 
 
class Test{{ cookiecutter.repo_name|capitalize }}(unittest.TestCase):
 
    def setUp(self):
        pass
 
    def test_something(self):
        pass
 
    def tearDown(self):
        pass
 
if __name__ == '__main__':
    unittest.main()

On note l'usage du filtre jinja capitalize. Tous les outils de jinja sont à disposition, ce serait con de s'en priver.

Pour utiliser le template on fait $ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git, ce qui nous donne :

Clonage dans 'cookiecutter-pypackage'...
remote: Counting objects: 505, done.
remote: Total 505 (delta 0), reused 0 (delta 0), pack-reused 505
Réception d'objets: 100% (505/505), 77.89 KiB | 0 bytes/s, done.
Résolution des deltas: 100% (265/265), done.
Vérification de la connectivité... fait.
full_name (default is "Audrey Roy")? Sam
email (default is "audreyr@gmail.com")? lesametlemax@gmail.com
github_username (default is "audreyr")? sam
project_name (default is "Python Boilerplate")? essai
repo_name (default is "boilerplate")? essai
project_short_description (default is "Python Boilerplate contains all the boilerplate you need to create a Python package.")? C'est un essai j'ai dis
release_date (default is "2015-01-11")? 
year (default is "2015")? 
version (default is "0.1.0")? 

Notez les valeurs par défaut du fichier JSON, qui sont celles de l'auteur.

Le résultat généré :

├── essai
│   ├── AUTHORS.rst
│   ├── CONTRIBUTING.rst
│   ├── docs
│   │   ├── authors.rst
│   │   ├── conf.py
│   │   ├── contributing.rst
│   │   ├── history.rst
│   │   ├── index.rst
│   │   ├── installation.rst
│   │   ├── make.bat
│   │   ├── Makefile
│   │   ├── readme.rst
│   │   └── usage.rst
│   ├── essai
│   │   ├── essai.py
│   │   └── __init__.py
│   ├── HISTORY.rst
│   ├── LICENSE
│   ├── Makefile
│   ├── MANIFEST.in
│   ├── README.rst
│   ├── requirements.txt
│   ├── setup.cfg
│   ├── setup.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_essai.py
│   └── tox.ini
└── README.rst

Le fichier __init__ est devenu :

# -*- coding: utf-8 -*-
 
__author__ = 'Sam'
__email__ = 'lesametlemax@gmail.com'
__version__ = '0.1.0'

Et le fichier de test :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
test_essai
----------------------------------
 
Tests for `essai` module.
"""
 
import unittest
 
from essai import essai
 
 
class TestEssai(unittest.TestCase):
 
    def setUp(self):
        pass
 
    def test_something(self):
        pass
 
    def tearDown(self):
        pass
 
if __name__ == '__main__':
    unittest.main()

L'outil accepte un beau degré de customisation, avec un fichier de configuration général au niveau de l'utilisateur (et donc des valeurs par défaut par utilisateur), une API programmable en Python, des hooks pre et post generation (qui permettent d'injecter des variables dynamiquement comme par exemple un uuid ou un timestamp).

Donc si vous recréez souvent les mêmes layout de projet encore et encore, pensez à cookiecutter.

Mais surtout, surtout, si vous codez votre propre framework, ne faites pas comme Django, utilisez l'API de cookiecutter au lieu de réinventer la roue.

Oh le beau scam ! 6

mercredi 10 juin 2015 à 17:16

J’ai reçu ce mail ce matin :

Attention: Important Notice , DOMAIN SERVICE NOTICE
Domain Name: SITEDESAM.COM

Complete and return by fax to:
1-206-278-9897

ATT: SAM
ADMINISTRATIVE CONTACT

5686876587@CONTACT.GANDI.NET
GANDI 63-65 BOULEVARD MASSENA – – (GANDI) PARIS – – – (GANDI) 75013
(GANDI) FR
WWW.SITEDESAM.COM
Please ensure that your contact information is correct or make the necessary changes above

Requested Reply Before
JUNE 08,2015

PART I: REVIEW SOLICITATION

Attn: SAM
As a courtesy to domain name holders, we are sending you this notification for your business Domain name search engine registration. This letter is to inform you that it’s time to send in your registration and save.

Failure to complete your Domain name search engine registration by the expiration date may result in cancellation of this offer making it difficult for your customers to locate you on the web.

Privatization allows the consumer a choice when registering. Search engine subscription includes domain name search engine submission. You are under no obligation to pay the amounts stated below unless you accept this offer. Do not discard, this notice is not an invoice it is a courtesy reminder to register your domain name search engine listing so your customers can locate you on the web.

This Notice for: WWW.SITEDESAM.COM will expire on JUNE 08,2015 Act today!

Select Term:

[ ] 1 year 06/08/2015 – 06/08/2016 $75.00
[ ] 2 year 06/08/2015 – 06/08/2017 $119.00
[ ] 5 year 06/08/2015 – 06/08/2020 $199.05
[ ] 10 year -Most Recommended- 06/08/2015 – 06/08/2025 $295.00
[ ] Lifetime (NEW!) Limited time offer – Best value! Lifetime $499.00

Today’s Date: _____________________ Signature: _____________________

Payment by Credit Card
Select the term above, then return by fax: 1-206-278-9897

SITEDESAM.COM

——————————————————————————————-

By accepting this offer, you agree not to hold DS liable for any part. Note that THIS IS NOT A BILL. This is a solicitation. You are under no obligation to pay the amounts stated unless you accept this offer. The information in this letter contains confidential and/or legally privileged information from the notification processing department of the DS 3501 Jack Northrop Ave. Suite #F9238 Hawthorne, CA 90250 USA, This information is intended only for the use of the individual(s) named above. There is no pre-existing relationship between DS and the domain mentioned above. This notice is not in any part associated with a continuation of services for domain registration. Search engine submission is an optional service that you can use as a part of your website optimization and alone may not increase the traffic to your site. If you do not wish to receive further updates from DS reply with Remove to unsubscribe. If you are not the intended recipient, you are hereby notified that disclosur
e, copying, distribution or the taking of any action in reliance on the contents for this letter is strictly prohibited.

Le mail est très bien fait, car en le scannant j’ai vu le nom de mon site, le mail de mon registrat, et le mot “expire” dedans en plus d’un formulaire à retourner par fax :). Le langage utilisé est particulièrement vicieux et bien composé, et il m’a donc forcé à le lire plus lentement pour bien comprendre qu’il s’agissait d’une grosse arnaque.

C’est comme ces lettres qu’on reçoit après la création d’une entreprise pour s’enregistrer auprès d’annuaires qui portent des noms qui font très sérieux comme “Enregistrement des membres des chambres commerciales”.

J’imagine bien le gars qui a 30000 problèmes à résoudre, la tête dans le guidon et qui fait sans chercher à comprendre. Ca doit rapporter une fortune;

Le don du mois 8

lundi 8 juin 2015 à 20:01

J’utilise Ubuntu au quotidien, et j’ai déjà donné au projet, mais les dernières décisions prises par l’équipe de la distrib ne me paraissent pas toujours judicieuses.

Aussi, afin de contribuer à Ubuntu, mais aussi à de nombreux autres projets, le don du mois sera pour le projet Debian, qui est à la racine de nombreuses distribs, dont Ubuntu. Les bénéfices se feront donc en cascade.

L’équipe de Debian a su garder un cap en terme de qualité et de stabilité au cours des longues années de son existence, et sur un projet libre de cette taille, c’est un exploit.

$50 partent donc pour eux. Avec l’adoption de systemd par défaut, ils vont avoir besoin de ressources pour réaménager la caverne à trolls.

La branlette fait faire des économies 26

samedi 6 juin 2015 à 15:16

Vous connaissez cette sagesse populaire qui incite à ne jamais faire les courses le ventre vide ?

J’aimerais ajouter une règle d’hygiène de vie qu’il vaudrait enseigner dès le collège à tous les mâles en devenir : branlez-vous avant l’action.

Par action je n’entends pas la session de pirouette basque avec la voisine, bien que selon la situation ça puisse être une bonne stratégie.

Non, je parles de remplir un objectif qui demande un minimum de prise de décision suivi d’une action ou d’une interaction sociale majeure.

Dans Le Loup de Wall Street, qui n’est pas un monument du cinéma mais reste un divertissement scorcesien décent, un personnage secondaire résume bien le principe :

Et la raison est que, en plus de faire diminuer les tensions, se palucher un coup améliore sérieusement la capacité de choix, en retirant temporairement du diagramme décisionnel de votre tête tout un tas de losanges jaunes, biologiques et psychologiques.

Évidement, certains pourraient répliquer qu’il faudrait mieux avoir du self control, du recul et la capacité à gérer les situations en dehors de sa zone de confort.

A cela je répliquerais que oui, mais en attendant que chacun fasse murir le Clint Eastwood qui est en lui, un paquet de kleenex propose un bon rapport qualité/prix.

Avant un entretien de job, branlez-vous.

Avant de faire un gros achat, branlez-vous.

Avant d’aller dans une intense réunion, branlez-vous.

Avant de faire une code review, branlez-vous.

Avant de valider une mise en prod, branlez-vous.

Le seul cas où je ne recommande pas de se masturber, c’est pour la drague, contrairement à ce qu’on dit dans Marie à tout prix :

You choke the chicken before any big date, don’t you? Tell me you spank the monkey before any big date. Oh my God, he doesn’t flog the dolphin before a big date. Are you crazy? That’s like going out there with a loaded gun! Of course that’s why you’re nervous. Oh my dear friend, please sit, please. Look, um, after you’ve had sex with a girl, and you’re lying in bed with her, are you nervous? No, you’re not, why?

Parce que conserver une érection en suspens, ça garde motivé pour tendre vers son but, si je puis dire.

Pour le reste, dans le doute, branlez-vous.

Il en restera toujours quelque chose, n’est-pas ?

Hasta la vista ! 4

mardi 19 mai 2015 à 09:45

Je me barre pour environ 2 semaines, et ne pondrai pas d’article pendant cette période.

Mettez ce temps à profit pour travailler votre lancer de nain.