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

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

09 juil. 2007, 17:05

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.
Modifié en dernier par naholyr le 23 oct. 2007, 17:24, modifié 1 fois.

ViPHP
ViPHP | 4674 Messages

09 juil. 2007, 18:44

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

09 juil. 2007, 19:06

Je lis souvent
je n'aime pas Spyc
mais je n'ai toujours pas d'exemple concret de pourquoi il n'est pas bon ?

ViPHP
ViPHP | 4674 Messages

09 juil. 2007, 19:55

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 ;-)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

09 juil. 2007, 21:05

les aspects graphiques de Yaml
???

ViPHP
ViPHP | 4674 Messages

09 juil. 2007, 23:07

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 19672 Messages

11 juil. 2007, 19:06

Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4674 Messages

11 juil. 2007, 19:35

C'est ce qu'utilise Symfony au passage :) Dans les sources il est dit qu'ils préfèrent Syck à Spyc. Normal : plus rapide.
Modifié en dernier par Hywan le 11 juil. 2007, 22:27, modifié 1 fois.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

11 juil. 2007, 21:58

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;
}

ViPHP
ViPHP | 4674 Messages

11 juil. 2007, 22:25

Oui c'est ce que je disais. Enfin voulais dire :P
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

12 juil. 2007, 08:26

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);
}
;)

Petit nouveau ! | 1 Messages

23 oct. 2007, 16:50

Je tombe sur un super topic ! mais le lien pour télécharger le converter ne va pas !

please, help me :cry:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

23 oct. 2007, 17:25

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.