Wikipedia: toutes les routes mènent à Philosophie

Un nouveau mème circule : sur Wikipedia, tous les liens mènent à l’article Philosophie ou forment une boucle.

Méthode

  • Choisir un article ou cliquer sur Un article au hasard.
  • Cliquer sur le premier lien de l’article. Nous excluons les liens techniques de Wikipedia (ex. Cet article est une ébauche etc.), les tables des matières, la phonétique…
  • Répéter jusqu’à tomber sur l’article Philosophie ou sur une boucle (on retombe cycliquement sur les mêmes liens).

Test de l’hypothèse

Premier essai

Deuxième essai

Il n’est pas nécessaire d’aller jusqu’à la boucle ; si on tombe sur latin, on sait que ça se termine en boucle.

En fait, l’hypothèse est probablement valable quel que soit l’article choisi. C’est la probabilité de tomber dessus qui change. Ainsi, il est plus probable de tomber sur Philosophie que sur Pablo Picasso, mais la logique est la même.

Afficher le chemin complet dans la barre du Finder

Par défaut, le Finder affiche uniquement le nom du répertoire en cours comme titre de page. C’est peut-être suffisant pour votre musique, mais quand vous avez deux douzaines de projets Rails en cours (ou plusieurs branches d’un projet), ça ne vous avance pas tellement de savoir que vous êtes dans models ou dans controllers.

Vous pouvez faire afficher le chemin complet dans la barre de titre en passant une commande dans un Terminal :

defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

Ensuite il faut relancer le Finder, soit en rebootant (à la Windows) soit en envoyant un signal à la tâche (à la Unix) :

killall Finder

Et hop !

via TUAW

RSpec have_tag et Rails assert_select cheat sheet

have_tag (RSpec) et assert_select (Rails) facilitent le test des vues grâce à une syntaxe proche de celle du CSS. Vérifions par exemple la présence d’un titre qui contient le texte Subtitle et d’un formulaire (id= »swap ») avec deux boutons radio et un bouton de soumission (class= »button_save ») :

response.should have_tag("h2", /Subtitle/)
response.should have_tag("form#swap[method=post]")
response.should have_tag("form#swap input[type=radio][name=?]", 'part1')
response.should have_tag("form#swap input[type=radio][name=?]", 'part2')
response.should have_tag("form#swap input.button_save[type=submit]")

Autre exemple, un formulaire AJAX dans sa div (id= »filter », mais vous avez compris maintenant) avec une liste déroulante, avec soumission par GET sur changement de la sélection :

response.should have_tag("select option", "All")
response.should have_tag("select option", /20/)
response.should_not have_tag("select option", /21/)
response.should have_tag("div#filter form[method=?]", 'get')
response.should have_tag("div#filter form select[onchange=?]", 'this.form.submit()')

La syntaxe du sélecteur a beau être proche de celle du CSS, il est difficile de s’en rappeler toutes les subtilités. C’est là qu’intervient l’excellente cheat sheet créée par Assaf Arkin de Labnotes. Indispensable 

Firefox 3.1 — compatibilité des add-ons

Firefox 3.1 offre bien des nouveautés intéressantes, en particulier un nouvel interpréteur de Javascript d’une extrême rapidité. La liste des évolutions entre les versions 3.0 et 3.1 est impressionnante; bien des éditeurs de logiciel en auraient fait une changement de version majeure.

Mais nous utilisons aussi des modules complémentaires dont certains sont indispensables. En ce qui me concerne, je ne pourrais développer sans Firebug ou Web Developer. Pencil me sert pour les maquettes. L’absence de All-in-one Gestures m’handicape grandement.

Heureusement, l’équipe Firefox publie l’état de compatibilité des modules les plus utilisés. La page regroupe les modules représentant 95% des usages recensés…

Déploiement Capistrano à partir de Windows

Capistrano est un outil de déploiement puissant et facile d’emploi, dont j’ai déjà parlé. Il tourne sous Windows, Mac OS et Linux (entre autres) et est d’une mise en service aisée si l’on connait ssh et subversion.

C’est pourquoi j’ai été fort (désagréablement) surpris quand mon récent cap deploy a échoué avec le message d’erreur suivant :

c:/ruby/lib/ruby/gems/1.8/gems/capistrano-2.5.1/lib/capistrano/recipes/deploy.rb:97:in ``': No such file or directory - svn info http://svn.example.com/
On comprend bien qu’il s’agit de ma machine mobile et portable qui tourne sous Windows Vista. Le client SVN de choix sous Windows reste sans conteste TortoiseSVN. Malheureusement (d’une certaine manière), TortoiseSVN est un vrai client Subversion et non un wrapper graphique s’appuyant sur l’exécutable svn (en ligne de commande donc).

Or Capistrano invoque l’exécutable sus-cité, et ne le trouve pas. Solution simple et rapide : installer le client officiel SVN, que l’on peut trouver ici.

Et hop !

RSpec : tester le contenu d’un content_for

Une spécification de vue sous RSpec pourrait ressembler à ça :

  it "should render column titles" do
    render "/feeds/index.html.erb"
    response.should have_tag("tr>th", "name")
    response.should have_tag("tr>th", "url")
  end

Mais cette méthode ne permet pas de tester les bribes de HTML qui sont produites dans un content_for. En effet, ces bribes sont incluses directement dans le layout, pas dans la production de la vue. Pour ce faire, ajouter dans spec_helper.rb :

  def content_for(name)
    response.template.instance_variable_get("@content_for_#{name}")
  end

Puis dans les specs :

  it "should render a 'New feed' link" do
    render "/feeds/index.html.erb"
    content_for(:somewhere).should have_tag("a[href=?]", new_feed_path)
  end

Merci à Carl-Johan Kihlbom.

Capistrano – symboles :scm_user et :scm_username

Si votre nom d’utilisateur courant n’est pas celui qui vous permet d’accéder à votre système de gestion de version, vous pouvez le spécifier dans deploy.rb.

Par contre, le nom de ce symbole a été harmonisé. C’était par exemple :scm_user pour Mercurial ou :p4user pour Perforce). Il faut maintenant utiliser :scm_username, au moins pour Subversion. La compatibilité est maintenue pour Mercurial et Perforce.

Vous pouvez également spécifier :scm_password. L’inconvénient dans le cas de Subversion est que ce mot de passe est affiché en clair sur l’écran.

Ruby on Rails : l’opérateur bang-bang !!

Bon, ce n’est pas vraiment un opérateur, mais l’idiome est assez répandu et peut surprendre. Il est utilisé pour convertir nil en false, ce qui peut éviter des tests spécifiques comme if variable.nil?

Deux petits rappels :

  1. ! est l’opérateur de négation logique.
  2. Seuls false et nil ont la valeur booléenne FAUX. Tout le reste est vrai (y compris 0, la chaîne de caractère vide, etc.

Nous en déduisons la table de vérité suivante :

variable !variable !!variable
* false true
false true false
nil true false
  • = n’importe quoi sauf nil ou false, donc de valeur booléenne true.

CQFD.

Test des routes nommées avec RSpec

RSpec offre deux fonctions pour tester les routes. La première vérifie la génération de l’URL, étant donnés les contrôleurs, actions, etc. :

route_for(:controller => 'sessions', :action => 'new').should == "/login"

La seconde fait la vérification inverse ; la requête active-t-elle les bons paramètres ?

params_from(:get, '/login').should == {:controller => 'sessions', :action => 'new'}

Il n’y a pas de fonction spécifique pour tester les routes nommées (par exemple login_path). Ça ne présente pas de difficulté particulière, mais il y a une astuce : les routes nommées ne sont chargées qu’après le première requête. Un exemple :

describe "named routing" do
    before(:each) do
      # If you haven't already made a get/post request through the rails integration
      # session infrastructure the named routes don't get loaded
      get :new
    end
    it "should route login_path() correctly" do
      login_path.should == "/login"
    end
  end

Installation de Ruby Gems 1.3

La version 1.3 de Ruby Gems est sortie. Ne vous précipitez pas :

  • Un bug signalé sur Windows
  • Un problème potentiel de mise à jour : RubyGems 1.1 and 1.2 have problems upgrading… En gros, la commande ordinaire gem update --system ne marche pas.

L’annonce originale est ici.

Il est toujours possible de télécharger la version 1.3 et de l’installer manuellement.