kAworu's avatar

geewee: The Geek Weblog Engine.

publié par kAworu
il y a environ deux ans

Voilà, dans mon désespoir de trouver un blog satisfaisant j'ai fini par en coder un. Voici geewee, The Geek Weblog Engine. Le concept est un blog simple, administrable uniquement avec un client en CLI interactif qui lance votre $EDITOR favoris au lieu d'une interface web avec un formulaire bloated et 30'000 boutons partout.

Mon blog va à partir de maintenant être "geewee powered" et donc les liens atom/rss de ce bon vieux typo vont gicler. Si toi cher lecteur, est abonné à ce blog, le nouveau lien est http://blog.kaworu.ch/posts.atom. Je garde typo tant que il manque quelques fonctionalitées à geewee (notamment la gestion des pages statiques), mais il devrait être loin d'ici une semaine ou deux.

geewee

geewee est écrit en Ruby On Rails et commence tout juste à être utilisable, voilà une marche à suivre pour l'installer et jouer avec.

Installation

Il faut commencer par avoir ruby, rubygems et Ruby On Rails en version 2.3.5 sur votre machine (via votre package manager favoris). Ensuite télécharger geewee ici ou alors:

hg clone http://hg.kaworu.ch/rails-geewee

Configuration

Créer une base de donnée et éditer config/database.yml avec les bon paramètres. Hop un petit exemple pour PostgreSQL:

createuser --no-createdb --no-createrole --login --pwprompt --encrypted geewee
# createuser va demander le password pour le nouvel utilisateur
createdb --encoding=utf8 --owner=geewee geeweedb

Le fichier config/database.yml aura à peu près cette tête:

development:
    adapter: postgresql
    database: geeweedb
    username: geewee
    password: <secret>
    encoding: utf8

Ensuite il faut installer les gems dont geewee a besoin:

rake gems:install

Puis on prépare les tables de la db:

rake db:migrate

Finalement il faut créer un utilisateur (auteur) pour le blog (geewee supporte d'avoir plusieurs auteurs). On lance une console rails:

./script/console

Puis

me = Author.create! :name => 'my_name', :email => 'my_email'
puts me.single_access_token

Copier le single_access_token, on va en avoir besoin. C'est la méthode utilisée pour l'authentification du client.

Utilisation

Configuration du client

geewee utilise une API json, pour faire communiquer l'application et le client. Le client geewee se trouve dans client/geewee. Il est écrit en ruby et a besoin de la gem json (le parseur yaml de ruby est 1.0 et n'est pas compatible avec json, si un jour la version 1.2 de yaml est dans ruby on aura plus besoin de cette dépendance vu que yaml >= 1.2 est un superset de json). On installe, donc:

gem install json_pure

Pour configurer le client il faut l'éditer tout en bas du fichier:

###
# Config for the geewee client in YAML, example:
=begin

---
base_url:       http://my.sexy.geewee/blog/path
editor:         ee
geewee_api_key: my_secret_single_access_token

=end


__END__
---
base_url:       http://localhost:3000
editor:         vim
geewee_api_key: PLs_gVBZwd5EudsRMObO

Modifier les valeurs après le __END__. Il y a (pour l'instant) trois champs configurables:

  • base_url (requis): l'adresse de votre blog
  • editor (facultatif): votre éditeur de texte favoris. Si ce champ n'est pas configuré alors $EDITOR est utilisé.
  • geewee_api_key (requis): le single_access_token de votre utilisateur, c'est ce qui permet de vous authentifier.

Pour l'instant le client ne peut que gérer les catégories et les posts (les pages statiques, utilisateurs et commentaires sont supportés, mais pas encore implémenté coté client). On lance une fois sans arguments pour avoir l'aide:

% ./client/geewee

geewee: wrong # of arguments

usage: geewee operation ressource [arguments...]

CRUD operations:
===============>
    geewee create ressource
    geewee create ressource /path/to/file
    geewee show resource
    geewee show resource id
    geewee update ressource
    geewee update ressource id
    geewee update ressource id /path/to/file
    geewee destroy ressource
    geewee destroy ressource id

operations and resources:
========================>
-       show: posts, categories
-    destroy: posts, categories
-    publish: posts
-     update: posts, categories
-     create: posts, categories

On voit que les quatre opérations de bases sont disponibles pour les posts et catégories, ainsi qu'une supplémentaire (publish) pour les posts.

Opérations

show affiche les informations. Si on ne donne pas de id en paramètre, la commande show va afficher toutes les entrée de la resource demandée (par exemple toutes les catégories). Exemples:

% geewee show categories
1. blabla (6)
2. prog (5)
3. admin (3)
4. end-user (4)
% geewee show posts
 18. [unpublished] "geewee: The Geek Weblog Engine." by kAworu in blabla (Ruby On Rails, geewee, blog)
 17. "dans l'absolu, ça marche pas vraiment" by kAworu in prog (C, algo)
 16. "this is it!" by kAworu in blabla (blog)
 15. "Android FAIL" by kAworu in end-user (Google, FAIL)
 14. "nice try" by kAworu in prog (NetBSD, Knuth, C)
[...]
% geewee show posts 18
created_at: 2010-03-15T00:03:04+01:00
updated_at: 2010-03-15T00:03:05+01:00
id:       18
author:   kAworu
category: blabla
tags:     Ruby On Rails, geewee, blog
title:    geewee: The Geek Weblog Engine.

Voilà, dans mon désespoir de
[...]

Les autres commandes font ce qu'on attend d'elles, c'est à dire créer (create), modifier (update), effacer (delete) et publier (publish) (on peut aussi publier via une opération update, c'est juste moins pratique). Pour la suite on va faire un petit exemple pour faire le tour des fonctionalités.

Exemple

Catégorie

Il faut tout d'abord lancer le serveur:

./script/server

Pour créer une nouvelle catégorie on lance la commande:

geewee create categories

Là notre vim^Wéditeur favoris est lancé avec un fichier qui contient seulement:

[category]display_name:

On entre le nom que l'on veut. Si une erreur survient (vide, nom déjà pris etc) le client va afficher le chemin du fichier que l'on a édité (par exemple /tmp/geewee_126861126727982). Pour les catégories c'est pas très important car il n'y a qu'un champ, mais pour un post ça permet de pouvoir aller chercher le fichier, le modifier et recommencer l'opération avec comme argument le fichier (pour create et update). On peut aussi utiliser - comme argument de fichier, et à ce moment le client utilise l'entrée standard (ça permet de le faire à travers le réseau, ssh etc). Si on rentre un nom valide, par exemple:

[category]display_name: geewee rox!

Tout devrait bien se passer et on va voir:

===> new Category created:
  1. geewee rox! (0)

Le 1. est l'id de la catégorie, et (0) le nombre de post dans cette catégorie.

Post (ou Billet, à choix)

Maintenant que notre blog a une catégorie, on peut commencer à écrire des posts!

geewee create posts
  1. geewee rox! (0)
???> Choose a Category id (n to create a new one): 

On entre l'id de la catégorie de notre nouveau post (avec n on pourra créer une nouvelle catégorie comme on vient de le faire). On va entrer "1" et à nouveau notre éditeur est lancé:

 [post]title: 
 [post]category_id: 1
 [post]tag_list: 

 *Intro*

 %...

 *Body*

On voit que le champ category_id a été rempli avec celle que l'on a séléctionné. Les champs title et tag_list sont vides et à remplir. tag_list est une liste de mot-clés, séparée par des virgules. Il y a ensuite une ligne vide et la ligne *Intro*. On peut placer ici une courte introduction qui sera sur la page principale, le reste (*Body*) ne sera visible que sur la page du post (si on suit "lire la suite..."). l'intro et le body sont séparés par la ligne:

%...

Dans l'intro et le body on peut utiliser markdown comme markup, et des balises spéciales pour coderay:

%code lang=C
for (;;)
    fork();
%/code

Attention il faut que %code, %/code et %... soient en début de ligne!

L'argument lang= de %code est donné à coderay, il y a donc tous les langages que coderay supporte qui sont disponibles :D

On continue!

 [post]title: Mon premier post!
 [post]category_id: 1
 [post]tag_list: geewee, blog

 Mon premier post avec _geewee_ !

 %...

 %code lang=Ruby
     10.times { puts "youpie!" }
 %/code

Lorsque l'on a fini, on nous demande gentillement si il faut le publier ou pas :)

???> publish now? [y/n]:

On met non (n), car on veut avoir un aperçu du post avant de le publier.

===> new Post created: http://blog.kaworu.ch/posts/mon-premier-post

On peut maintenant aller voir ce que ça donne: mon premier post!

Si on est pas content, on fait un petit:

geewee update posts

Les posts sont affichés et on entre l'id de celui que l'on veut modifier (on peut donner l'id drectement en argument, et le fichier également). Une fois qu'on est content, on le publie:

geewee publish posts # on peut donner l'id aussi.
  1. [unpublished] "Mon premier post!" by kAworu in geewee rox! (blog, geewee)
???> target Post id to publish: 1
===> published.

Pour destroy je vous fait pas un dessin, il affiche les posts (ou catégories) et demande l'id si ce n'est pas donné en argument, et demande une confirmation.

Oui mais attention

geewee est tout jeune (j'ai commencé il y a une semaine seulement) et a encore pas mal de limitations.

  • les messages d'erreurs du client ne sont pas encore toujours ultra claires.
  • les fichiers dans /tmp du client ne sont pour l'instant jamais effacés.
  • le client ne peut pas encore gérer les pages statiques, ni les commentaires, ni les utilisateurs, ni les fichiers statiques.
  • le blog n'est pas encore configurable (nom et url du blog par exemple), même si c'est faisable en deux coups de vim.
  • pour tout le reste il y a eurocard mastercard™.

Il y a la todo liste (devtodo) est dans le projet, si vous avez un vim et un peu de temps, patches & tests sont les bienvenus :D

un commentaire

écrire un commentaire

  1. Tengu il y a environ deux ans Tengu's avatar

    faudra que je teste à côté du mien, tien, histoire de voir :).

    L'idée d'une adminCLI est 'achement cool en fait :D

écrire un commentaire:


(utilisé pour gravatar, ne sera pas affiché)



tu peux utiliser la syntaxe markdown :)