Installer RSpec et Autotest

Installation de RSpec

./script/plugin install git://github.com/dchelimsky/rspec.git -r 1.1.4
./script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 1.1.4
./script/generate rspec

Installation d’Autotest

sudo gem install ZenTest

Création d’un modèle avec son script de test RSpec

./script/generate rspec_model <nom_du_modèle>

Lancement d’Autotest

autotest # dans le répertoire de l'application

Autotest va exécuter le script spec/models/<nom_du_modèle>_spec.rb automatiquement une première fois,  puis chaque fois que vous sauvez ce fichier après y avoir ajouté un test.

Pour des explications détaillées, voir l’article de Philippe Hanrigou, Getting started with Autotest – Continuous Testing [en anglais]. Vous pouvez aussi voir comment ça se passe dans cette courte vidéo.

Installer SQLite Manager pour XULRunner

SQLite Manager est un client graphique pour SQLite. SQLite Manager est disponible comme extension Firefox (et autre Thunderbird, Seamonky, etc.) et tourne aussi sur XULRunner. L’installer sur XULRunner permet de le lancer de manière indépendante de Firefox.

Installation sur Mac OS X

  1. Télécharger XULRunner : xulrunner-1.9.en-US.mac-pkg.dmg
  2. Installer XULRunner
  3. Télécharger SQLite Manager pour XULRunner : SQLiteManager_XR_0.3.10.zip
  4. Installer SQLite Manager en ligne de commande (lancer Terminal)
/Library/Frameworks/XUL.framework/xulrunner-bin --install-app Downloads/SQLiteManager_XR_0.3.10.zip

Lancement de SQLite Manager

L’application est disponible dans Applications/Mrinal Kant/SQLite Manager.app.

Rails : chargement des données initiales dans la base de données

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.

Localisation de Ruby on Rails

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 du logiciel iPhone est sortie

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.

Une commande Ubiquity pour accéder directement à l’API Ruby

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.

Test fixture pour le plugin acts_as_authenticated

É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

Ressources sur les Test fixtures

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.

Le carrefour du Zen et du test

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.

Test fixtures et reformatage

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 ?