15 septembre 2008 – 20:47
Il est fréquent que les applications aient besoin, pour fonctionner, de données initiales dans la base de données. Il y a plusieurs avis dans la communauté sur le moyen de charger ces données.
Aucune méthode préférentielle ne se dégage. En particulier, les méthodes proposant de créer les données de test avec le code de l’application sont inapplicables pour une importation sérieuse, tant par leur lourdeur que par la difficulté de maintenir les données de test au fur de l’évolution du code. J’ai choisi trois articles qui couvrent bien le sujet.
Luke Francl a écrit un article qui balaye les diverses possibilités Loading seed data.
Michael Bleigh propose, dans son article Seed Fu: Simple Seed Data for Rails, de créer les données grâce à des scripts Ruby placés dans le répertoire db/fixtures.
Enfin, Jeffrey Allan Hardy décrit dans Seed Data in Rails la méthode simple et aisée à mettre en œuvre que j’ai retenue. Il s’agit d’utiliser le puissant mécanisme des fixtures dans une tâche rake.
Les données sont saisies dans des fichiers YAML placés dans le nouveau répertoire db/fixtures. Une tâche rake est ajouté en créant le fichier db_seed.rake dans le répertoire lib/tasks.
namespace :db do
desc "Load seed fixtures (from db/fixtures) into the current environment's database."
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
Fixtures.create_fixtures('db/fixtures', File.basename(file, '.*'))
end
end
end
Et voilà ! Les données sont chargées avec la commande rake db:seed.
14 septembre 2008 – 23:45
Je suis en train de traduire les fichiers de régionalisation (l10n, de l’anglais localization) de l’application de démonstration de Clemens Kofler.
L’internationalisation de Rails sera intégrée dans la version 2.2 qui est prévue pour la fin de l’année
La version 2.1 (à ne pas confondre avec la 2.0.1) du logiciel de l’iPhone est sortie. Cette fois-ci, Apple ne se contente pas du cryptique corrections de bogues, mais donne des détails. Certaines corrections ou évolutions étaient attendues impatiemment, dont :
- Diminution des échecs d’émission d’appels et des coupures lors des communication (enfin !) ;
- Augmentation de l’autonomie de la batterie ;
- Augmentation considérable de la rapidité de sauvegarde ;
- Meilleures performances des SMS ;
Plus quelques autres bricoles que vous pourrez lire en installant cette nouvelle version 2.1 avec votre nouvelle version 8.0 d’iTunes : tout est neuf chez Apple.
12 septembre 2008 – 12:02
Jack Dempsey a créé une commande Ubiquity pour accéder directement à l’API Ruby sur APIdock. Vous pouvez l’installer en collant le code dans l’éditeur de commandes Ubiquity. ou en vous abonnant (le bouton apparaît en haut à droite du bandeau).
L’utilisation est simple : invoquer Ubiquity (alt-espace sur mon Mac), taper ruby <nom-de-fonction> puis <Enter> et la page s’ouvre dans un nouvel onglet.
10 septembre 2008 – 18:36
Écrire des fixtures n’est généralement pas compliqué (je ne parle pas de maintenance ici). Les champs cryptés posent néanmoins un problème particulier, ne serait-ce que celui de trouver la bonne fonction de cryptage. Dans le cas du plugin acts_as_authenticated, voici la démarche à suivre.
Méthode
Nous voulons un salt raisonnable. Nous l’obtenons donc sur random.org. J’ai obtenu 1290 9d9c 16f8 5fad d3b5 a11f 2fb9 f358 que je recopie dans le champ salt (sans les espaces).
Pour encrypter le mot de passe SourceStuff, nous lançons la console et nous cryptons avec Digest::SHA1. Le résultat est bien sûr recopié dans le champ crypted_password.
xtian$ ./script/console
Loading development environment (Rails 2.1.0)
>> Digest::SHA1.hexdigest("--12909d9c16f85fadd3b5a11f2fb9f358--SourceStuff--")
=> "843a3ec693ba69e5f09ba4554f0d0799c979b93c"
Euh… bien sûr vous remplacez le salt et le mot de passe par les votres?. Dois-je le dire ?
Résultat
ErikSink:
login: eric
email: eric@softwarelegend.com
salt: 12909d9c16f85fadd3b5a11f2fb9f358
crypted_password: 843a3ec693ba69e5f09ba4554f0d0799c979b93c
Les informations
La base : le chapitre 7 du manuel, The Lo-Down on Fixtures et la référence.
Une bonne introduction aux fixtures dans Rails 2.0 : Fixtures in Rails 2.0
Si vous n’aimez pas les screencasts, la même info dans un blog : What’s New in Edge Rails: Fixtures Just Got a Whole Lot Easier
Les avis
Le titre de l’article se passe de commentaire : Why Fixtures Suck (And How We Can Fix Them). Un peu vieux, il date du mois d’août 2006
Daniel Manges propose de remplacer les fixtures par des factories. Paul Gross propose un raffinement de la méthode. À creuser.
Chris Wanstrath propose des Fixtures scenarios. Les commentaires qui suivent sont particulièrement intéressants.
Les outils
Fabien Jakimowicz vous propose des tâches rake qui construisent vos fixtures à partir d’une base de données dans son article Rails plugin: named fixtures exporter
Clefs étrangères et intégrité référentielle
Les clefs étrangères présentent une difficulté : il n’est plus possible d’insérer ni de supprimer les enregistrements dans la base dans un ordre quelconque. Per Olesen propose une technique pour résoudre ce problème dans son article Rails Fixtures Tips.
La voie de Testivus — la sagesse du test unitaire dans une ancienne startup.
Don’t get stuck on unit testing dogma
Embrace unit testing karma
Le même article en pdf.
Les tests fixtures sont un des moyens de gérer les données nécessaires aux tests. Le système de test fixtures de Ruby on Rails se distingue par sa grande facilité d’écriture. Les données sont saisies dans des fichiers YAML, et le système de test gère les id, les relations 1-n et les relations n-n.
Parfois les données brutes ne sont pas disponibles dans le bon format. L’éditeur vi (ou vim), disponible sur toutes les bonnes plateformes, dispose d’une commande d’édition par expressions régulières très puissante. Prenons un exemple. J’ai donc besoin de convertir une liste d’ATA au format YAML.
Format liste
21 : Air conditioning
22 : Auto flight
23 : Communications
Format YAML
21:
number: 21
description: Air conditioning
22:
number: 22
description: Auto flight
23:
number: 23
description: Communications
La commande vi de substitution
Une « simple » commande suffit:
:%s/\([0-9][0-9]\) : \(.*\)/\1:\r number: \1\r description: \2\r/
Ça paraît un peu rude, mais c’est facile à décortiquer. Prenons la commande dans l’ordre.
% toutes les lignes du fichier
s/.../.../ la commande de substitution qui va être appliquée à chaque ligne
[0-9][0-9] deux chiffres ; je mémorise le numéro dans \1 en le mettant entre \( et \)
: deux points entre deux espace
.* tout le reste de la ligne, que je \(mémorise\) dans \2
- maintenant le remplacement : je récupère le numéro avec \1, que j’insère suivi de : et d’un saut de ligne
- insertion de
number: puis le numéro
- insertion de
description: puis le texte récupéré
Facile, non ?
Je crois bien que la navigation dans le site photo de John Ross est la pire que j’ai jamais vue. Bien évidemment, le site étant entièrement en flash, il est impossible de référencer une photo.
Pourtant, le flash peut améliorer l’interface, j’en veux pour preuve, par exemple, le Flash Uploader de WordPress.
Mozilla Labs a lancé mardi dernier son projet Ubiquity. Il s’agit d’une nouvelle façon d’interagir avec internet, en particulier via le web et le mail.
Ubiquity prend la forme d’un plugin Firefox, disponible sur toutes les plateformes (il y a quelques limitations d’emploi sur Linux).
Comme Quicksilver, Ubiquity est difficile à décrire tant il versatile. Essayez-le.
Ubiquity [via 43folders]