DM-sweatshop, le petit truc en plus par rapport à Factory Girl
En jouant avec Oupsnow, j'ai découvert une astuce sur DM-sweatshop qui est vraiment génial. Aucun exemple n'indique ça et pourtant, c'est selon moi révolutionnaire et même un atout face à Factory Girl.
dm-sweatshop
Pour ceux qui ne le savent pas dm-sweatshop est un gem de génération de donnée, inspiré de Factory Girl.
Factory Girl a été conçu pour éviter les fixtures dans Rails. Il a aussi l'avantage de permettre une meilleure vue des données présentes dans sa base de donnée durant son test. Je conseille tout à fait son utilisation et migre progressivement tous mes tests à l'utilisation de ce genre d'outil.
dm-sweatshop est le Factory Girl dédié à DataMapper, même si Factory Girl peux tout à fait être utilisable avec DataMapper.
Son petit plus
dm-sweatshop contrairement à Factory gril, génére un Hash d'attribut, qu'il surcharge avec les données fournis et génére un objet à partir de ce hash. Ceci entraine par exemple, l'impossibilité d'utiliser les méthodes d'association, il faut directement associer les identifiants.
Mais là où est son petit plus est que justement à cause de cette génération d'un Hash, il y a un Proc qui est généré et rien n'empêche de mettre du code ruby pour générer d'autre objets ou récupérer des objets déjà existant. On peux ainsi écrire l'exemple suivant :
Member.fixture { user = User.first(:login.not => 'admin') || User.gen! project = Project.first || Project.gen! not_project_id = [] while project.has_member?(user) not_project_id << project.id project = Project.first(:id.not => not_project_id) || Project.gen! end { :user_id => user.id, :project_id => project.id, :function_id => (Function.first ? Function.first.id : Function.gen.id),} }
Dans cette exemple, je crée un objet Membre qui est la liaison entre un Projet et un User. Mais au préalable, j'ai récupéré et créé des éléments Projet et User si rien n'existait.
Grâce à dm-sweatshop, c'est enfin fini, les problèmes de multiples liaisons qui avec Factory Girl ne peuvent être contourné (d'après mon expérience en tout cas) ce qui entrainait la création de méthode complète pour créer tout ça. Désormais tout est au même endroit.
Je ne saurais donc vous encourager à utiliser dm-sweatshop sur tout projet DataMapper à la place de Factory Girl.
[...]RailsCampParis 2, j'y étais et c'était sympa
Ca y est le RailsCamp Paris 2, c'est terminé hier avec un mashpit sur Merb. Je ne l'ai pas annoncé sur ce blog, mais j'étais bien sûr présent. Les locaux de Sun où nous avons pu faire ce RailsCamp était vraiment très beau et spacieux. Nous avons pu y avoir de très bonne discussion. Merci à Yannick d'avoir tenu le bar et à Jean-François Tran d'avoir organisé cet événement.:).
Au niveau des présentations, étant depuis décembre un fervent défenseur de Merb/DataMapper, j'ai fait de petite présentation sur ces deux outils merveilleux. En voici les slides :
Le lendemain, le mashpit sur Merb a ainsi vu l'apparition de 3 petit projets en Merb :
[...]Envoyer un email dans un model DataMapper
Avec Merb-mailer, merb fourni un système d'envoi d'email. Par contre merb étant un framework web se voulant ORM agnostique, merb-mailer est considéré comme un controller et non comme un model. De ce fait l'utilisation de la méthode send_mail n'est disponible que dans les controllers. Mais alors comment utiliser la méthode send_mail dans son model ? C'est très simple. Là encore merb utilise un système entièrement ruby ce qui facilite le méchanisme
Après une courte recherche dans le code de merb-mailer, j'ai pu constater que que la commande send_mail était dans un mixin. l'inclusion de ce mixin suffit donc à avoir la commande pour l'utiliser.
class Member include DataMapper::Resource include Merb::MailerMixin property :id, Serial property :name, String def register // some code send_mail (UserMailer, :register, { :from => "no-reply@example.com", :to => person.email, :subject => "Please activate your account" } end
Afficher les Log SQL avec Merb et DataMapper
Depuis peu, je tente d'utiliser Merb et DataMapper. Une différence notable entre Merb et Rails est le système de log. Comme Merb est ORM Agnostique, il n'affiche pas de base les logs SQL. J'ai cherché plusieurs fois comment avoir mes logs SQL de DataMapper directement dans ma console. J'ai fini par la trouvé sur le wiki de DataMapper. Je vous livre donc l'astuce :
Merb::BootLoader.after_app_loads do DataObjects::SQlite3.logger = DataObjects::Logger.new(STDOUT, :debug) end
Vous pouvez bien-sûr modifier le SQlite3 par Postgres ou MySQL. Cette comment fait une sortie en mode debug sur STDOUT. On aurait aussi pu mettre un fichier ('log/dm.log').
Pour connaitre la liste des niveaux de logs, la voici :
- fatal
- error
- warn
- info
- debug