title:      Un projet Python : de l&#39;idée à la publication
slug:       un-projet-python-de-lidee-la-publication
date:       2010-12-03 01:20:50
type:       post
vignette:   images/logos/graphe-social.png
contextual_title1:  Bilan sur les rencontres Django 2011
contextual_url1:    20110426-bilan-sur-les-rencontres-django-2011
contextual_title2:  Format de conférence pour les rencontres Django 2011
contextual_url2:    20101210-format-de-conference-pour-les-rencontres-django-2011
contextual_title3:  ★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr
contextual_url3:    20101130-de-lopendata-au-linkeddata-exemple-de-nosdonneesfr

J'aime coder en Python mais pas uniquement pour l'esthétique ou la puissance du langage, j'apprécie l'écosystème me permettant de concrétiser une idée en quelques commandes. Je vais prendre un exemple concret avec l'idée du jour qui était de créer un triple store à partir de redis_graph suite à [un tweet de Régis Gaidot](http://twitter.com/#!/rgaidot/status/10317008201580544).

Au final, je n'aurais pas utilisé redis_graph car l'implémentation utilisant des sets était limitante et je préférais avoir recours à des hashs mais ce n'est pas l'objet du billet. Je vais essayer de décrire commande par commande ce que j'ai pu faire cette après midi.


## Initialisation ##

On commence par installer redis, pour ça l'utilisation de [homebrew](http://mxcl.github.com/homebrew/) sur mac est vraiment une bénédiction quand on a connu la puissance d'apt-get...

    $ brew install redis

Et ensuite il faut un peu deviner comment lancer le serveur (bon ok, ou lire la doc), tiens il y a des redis-* dans mon path, essayons redis-server, bingo ! Et voilà notre serveur de test lancé, pas trop besoin de se préoccuper de la configuration pour l'instant.

Passons à l'environnement Python, ici on utilise [virtualenv](http://virtualenv.openplans.org/) (associé à [virtualenvwrapper](http://www.doughellmann.com/projects/virtualenvwrapper/)) qui est la solution miracle que tout le monde attendait pour avoir des environnements Python virtuels indépendants. Et on installe les dépendances :

    $ mkvirtualenv redis_triplestore --no-site-packages
    $ cd your/path/
    $ workon redis_triplestore
    $ pip install -e git+https://github.com/andymccurdy/redis-py.git#egg=redispy
    $ pip install redis_wrap
    $ pip install redis_graph

Pour éviter d'avoir à installer les dépendances à la main pour notre projet, on génère tout de suite un fichier requirements.txt qui permettra de faire ça en une fois :

    $ pip freeze > requirements.txt

Il y a l'[excellent billet de Nico](http://blog.akei.com/post/573774396/installer-django-dans-un-environnement-python-virtuel) si vous voulez un peu plus de détail sur tout ça.


## Développement ##

Ici vous commencez à coder votre idée, pas grand chose à dire là-dessus. J'ai décidé de mettre directement les tests dans le fichier car je voulais que ça tienne dans un snippet avant d'en faire un vrai projet.

J'ai juste encore une fois été étonné par la rapidité de Redis, au point de me demander au début si mes tests étaient bien évalués !

Je trouve ça élégant de pouvoir concrétiser une idée en une cinquantaine de lignes, juste pour le fun ;-).


## Publicaiton ##

Si j'hésite à publier ce genre de bêtise codée en 2h c'est car ça implique une certaine responsabilité et maintenance qui est chronophage (et pas vraiment enthousiasmante non plus...). Mais je me dis que ça peut être utile, au même titre que redis_wrap dont je me suis servi avec satisfation.

Ici c'est l'étape technique du setup.py qui consiste généralement en un copier/coller d'un autre/ancien projet qu'il faut adapter. Pour vérifier qu'il fonctionne bien :

    $ python setup.py sdist

Ok, votre paquet est créé, commençons par mettre le code quelque part. Ça dépend de vos préférences, je préfère mercurial donc je pousse ça sur [Bitbucket](https://bitbucket.org/) :

    # Création du dépôt sur Bitbucket
    $ hg init .
    $ mate .hg/hgrc
    # Ajout de l'URL du dépôt
    $ hg add
    $ hg ci -m "Initial implementation"
    $ hg tag "0.1"
    $ hg push

Vous pouvez faire les premières étapes dans un autre ordre mais de mémoire, si vous clonez et que vous avez déjà un dossier du même nom correspondant au projet, ça va râler.

Finalisons le setup.py avec 2/3 urls et enregistrons le projet sur pypi :

    $ python setup.py register
    $ python setup.py sdist upload

Et voilà ! Votre projet est [accessible à tous](http://code.welldev.org/redis_triplestore) et [installable par tous](http://pypi.python.org/pypi/redis_triplestore), il ne reste plus qu'à en faire la promotion :-).

