Page 1 sur 1

Schéma de modélisation YAML, génération de graphiques

Posté : 09 juil. 2007, 17:05
par naholyr
Bonjour,

Je viens vous présenter un outil que j'utilise assez régulièrement dans mes projets, et que j'ai un peu complété depuis que j'utilise Symfony.

En préambule, il faut connaître le format YAML.

Pour pouvoir générer les graphiques, il faut également avoir l'(excellentissime) application Graphviz installée.

[mode="troll"]
Pour résumer : XML c'est le mal, c'est verbeux, lourd, et soit-disant lisible par les humains (?). Le YAML c'est le bien, c'est léger, c'est clair, et vraiment lisible par les humains (!).
[/mode]


Pour ceux qui connaissent JSON, il s'agit d'un sous-ensemble de YAML.


Objectif

On écrit son modèle en YAML, cela décrit les objets et les relations qu'il y a entre eux. Du même coup cela décrit la base de données.
L'objectif est de pouvoir écrire un schéma simple, sans avoir à expliciter le fonctionnement interne des relations.
On devra pouvoir également spécifier des types personnalisés pour le confort d'utilisation.


Description

L'outil se compose de la classe externe "Spyc" (parseur de fichiers YAML), et de la classe "YmlSchemaConverter" qui offre les fonctionnalités de conversion.
Il se base sur la commande 'dot' de Graphviz pour générer les graphiques.

La classe permet de lire un schéma comme celui fourni en exemple et :
- de générer un graphique correspondant à ce schéma
- d'«étendre» les relations (cela consiste à expliciter les clé étrangères et les tables intermédiaires)
- de générer un schéma compatible Symfony (à compléter évidemment car cet outil ne gère pas les index ni les valeurs par défaut, entre autres).


Exemple

Voici le modèle que l'on veut décrire :
- Un utilisateur a une adresse e-mail, un nom, un niveau, un à plusieurs groupes, zéro à plusieurs permissions, et un profil d'utilisateur.
- Un profil d'utilisateur a un nom et un prénom.
- Un groupe a un nom, zéro à plusieurs utilisateurs, zéro à un groupe parent, et zéro à plusieurs permissions.
- Une permission a un nom d'action, et une valeur autorisé/interdit.

Voici un exemple de schéma YAML correspondant, que l'outil peut comprendre et analyser :

Code : Tout sélectionner

_types: email: varchar(128) level: [ guest, member, moderator, administrator ] user: username: { type: varchar(64), required: true } email: { type: _email, required: true } level: { type: _level, required: true } groups: { type: Group, has_many: true, required: true } permissions: { type: Permission, has_many: true } profile: { type: UserProfile, required: true } user_profile: first_name: { type: varchar(64) } last_name: { type: varchar(64) } permission: action: { type: varchar(16), required: true } authorized: { type: boolean, required: true } group: name: { type: varchar(64), required: true } parent_group: { type: Group } users: { type: User, has_many: true } permissions: { type: Permission, has_many: true }

Résultat des conversions de l'exemple

Graphique du schéma «normal» :
Image

Graphique du schéma «étendu» :
Image

Schéma Symfony :

Code : Tout sélectionner

propel: user: _attributes: phpName: User username: type: varchar(64) required: true email: type: varchar(128) required: true level: type: integer # ENUM( guest, member, moderator, administrator ) required: true id: type: ~ user_profile: _attributes: phpName: UserProfile first_name: type: varchar(64) last_name: type: varchar(64) user_id: type: ~ required: true permission: _attributes: phpName: Permission action: type: varchar(16) required: true authorized: type: boolean required: true user_id: type: ~ group_id: type: ~ group: _attributes: phpName: Group name: type: varchar(64) required: true id: type: ~ group_id: type: ~ user_group: _attributes: phpName: UserGroup user_id: type: ~ group_id: type: ~

Téléchargement

ymlconvert.zip (32k)


Utilisation

Un script d'exemple "convert-schema.php" ainsi qu'un schéma d'exemple "schema.yml" sont disponibles.
Pas besoin de se plonger dans les méandres de la documentation (à générer avec phpDocumentor) pour l'utiliser :
  1. Ecrivez votre propre schema dans "schema.yml"
  2. Ouvrez le fichier "convert-schema.php" pour modifier la configuration. Vous pourrez choisir quels graphiques générer, le chemin vers l'exécutable 'dot', et l'emplacement du schéma symfony à générer (ou pas).
  3. Exécutez le script "convert-schema.php"
Si vous avez laissé toutes les options par défaut : un dossier 'diagrams' sera créé et contiendra la source (fichier .dot) et le graphique (fichier .png) pour le schéma «normal» et le schéma «étendu», et un dossier 'symfony' sera créé et contiendra le schema compatible Symfony (fichier 'schema.yml').

Même pour ceux qui ne travaillent pas avec Symfony, la génération de graphiques automatiques est assez sympa si on a plus l'habitude de travailler en mode «texte» qu'avec un gros modeleur UML :)
Et je vous encourage à regarder en détail le fonctionnement de Graphviz, c'est un outil qui nous offre bien des possibilités trop méconnues.

Posté : 09 juil. 2007, 18:44
par Hywan
Très intéressant, et super résultat.

Pour ma part, je n'aime pas Spyc. Je me suis fais mon propre interpréteur Yaml (parser et dumper). Et il comprend plus de choses que Spyc :s Le point fort de Spyc, c'est la gestion des quotes, mais il ne supporte pas tout Yaml.

Sujet dans mes marques-pages, je retiens ;-)

Merci Naholyr.

Posté : 09 juil. 2007, 19:06
par naholyr
Je lis souvent
je n'aime pas Spyc
mais je n'ai toujours pas d'exemple concret de pourquoi il n'est pas bon ?

Posté : 09 juil. 2007, 19:55
par Hywan
Déjà, le code est assez incompréhensible.

D'autre part, il ne supporte pas les aspects graphiques de Yaml (mais peut être que mes tests dates). Tout le monde opte pour Spyc car c'était le seul existant lol. Mais je compte publié le mien avant Noel, on verra bien ;-)

Posté : 09 juil. 2007, 21:05
par naholyr
les aspects graphiques de Yaml
???

Posté : 09 juil. 2007, 23:07
par Hywan
Oui, j'ai vu qu'on pouvait utiliser une notation orientée graphisme pour Yaml mais je ne retrouve plus ce $@+%~# de lien ...

Demain matin sera un autre jours.

Posté : 11 juil. 2007, 19:06
par Cyrano

Posté : 11 juil. 2007, 19:35
par Hywan
C'est ce qu'utilise Symfony au passage :) Dans les sources il est dit qu'ils préfèrent Syck à Spyc. Normal : plus rapide.

Posté : 11 juil. 2007, 21:58
par naholyr
On peut d'ailleurs lire dans les sources de Symfony, pour la class sfYaml, quelque chose comme
if (syck est là) {
  utiliser syck;
} else {
  utilisr Spyc;
}

Posté : 11 juil. 2007, 22:25
par Hywan
Oui c'est ce que je disais. Enfin voulais dire :P

Posté : 12 juil. 2007, 08:26
par naholyr
D'ailleurs je l'avais copié dans l'outil que je présente ici, on le retrouve dans le constructeur :
if (function_exists('syck_load')) {
  $this->schema = syck_load($input);
} else {
  require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Spyc.class.php');
  $this->schema = Spyc::YAMLLoad($input);
}
;)

aaargh

Posté : 23 oct. 2007, 16:50
par jfsenechal
Je tombe sur un super topic ! mais le lien pour télécharger le converter ne va pas !

please, help me :cry:

Posté : 23 oct. 2007, 17:25
par naholyr
Un des nombreux trucs que Free m'a gracieusement supprimé sans préavis.
Tu as de la chance celui-là j'en avais un backup directement sous la main, c'est donc à nouveau online.