Shiny happy people coding

Codons avec le sourire

Vivre avec Edge (ou quoi de neuf dans Rails Edge) #1 - changement d'API et des tests de performances

| Comments

Voici la nouvelle traduction de Vivre avec Edge. Par contre, cette fois ci, comme annoncé dans cette news, cette news est issu du blog officiel de rubyonrails et non plus du blog de Chu Yeow

Comme Gregg Pollack l’indique il y a une semaine, Je conserve une note hebdomadaire au sujet des changements de edge Rails. C’est la première fois que Living on the Edge(of Rails) est apparu officiellement sur le blog officiel de Ruby on Rails.

Living on the Edge est une note hebdomadaire que je mettais sur mon propre blog après plusieurs récupération par Gregg Pollack of Rails Envy depuis décembre 2007. J’avais l’habitude d’être une contributeur actif de rails et non pas trop une personne qui réfléchis. Gregg et Jason ont été génial de m’ajouter à leur podcast hebdomadaire.

Et maintenant je suis ici, alors je vais essayer de faire de mon mieux et n’hésitez pas à être très critique pour que ça soit utile pour vous. Quand je blogguais cela dans mon petit blog personnel, ce n’était pas vital d’avoir une audience large et significative (NdT: Au moins sur ce blog ça reste toujours le cas). Laissez vos suggestions et critique dans les commentaires. Ils seront grandement appréciés.

De toutes façon il y a eu énormément de nouveauté durant les deux semaines après la release de Rails 2.1, changement de l’API et amélioration des performances. Donc au lieu de faire une très gros post, j’ai décidé de le séparé en 2 posts pour les nouveautés et changement d’API et les améliorations de performances. Dans ce post, je parlerais des nouveautés et changement de l’API

Changements mineurs de l’API

Commençons avec les changements mineurs de l’API.

link_to peux désormais prendre un block

Le helper link_to peux désormais prendre en argument un block. Utile dans les cas où vous avez long texte d’hyperlien avec des variables.:

<% link_to(@profile) do %> <%= @profile.name %> - Status: <%= @profile.status %> <% end %>

Certaine personne trouve cela plus propre que:

<%= link_to "#{@profile.name}Status: #{@profile.status}”, @profile %>

Ce changement a été apporté par Sam Stephenson (du fameux Prototype) et DHH.

Changeset details

ActiveRecord::Base#merge_conditions fait maintenant partie de l’API public

Jeremy Kemper a rendu public la méthode ActiveRecord::Base#merge_conditions.

C’est vraiment très pratique si vous avez des conditions issues de multiples sources ou qui se combine pour différentes raisons.

Post.merge_conditions( {:title => ‘Lucky ☆ Star’}, [‘rating IN (?)’, 1..5] ) => “(`posts`.`title` = ‘Lucky ☆ Star’) AND (rating IN (1,2,3,4,5))”

Notez bien que cela merge uniquement avec un boolean SQL AND (pas ORs).

Changeset details

Les associations peuvent prendre une option :validate

les associations peuvent désormais accepter une option c:validate comme ceci:

class Anime < ActiveRecord::Base has_many :characters, :validate => true end

Cela indique à ActiveRecord de valider l’association characters quand vous enregistrer le model Anime - exactement comment fonctionnait :validates_associated. La valeur par défaut est false, qui est le comportement actuel dans Rails 2.1 et plus récent, donc pas d’agitation à avoir. Cela fonctionne pour toutes les autre associations comme (has_one, belongs_to, has_and_belongs_to_many).

Merci à Jan De Poorter et Pratik Naik pour cela, qui permette aussi de résoudre un mauvais bug.

Changeset detailsTicket

ActiveSupport::StringInquirer et avantage de la méthode Rails.env.development?

David Heinemeier Hansson (généralement abbrégé par DHH – désolé!) a récemment ajouté un sous-classe à String, ActiveSupport::StringInquirer qui permet de faire ceci:

s = ActiveSupport::StringInquirer.new(‘awesome’) => “awesome” s.awesome? => true s.sucks? =>; false

Une utilisation immédiate de cette classe est quand vous voulez vérifier l’environnement de votre application en fonctionnement : Rails.env est enrobé en StringInquirer alors vous pouvez utiliser des méthodes comme Rails.env.development? et Rails.env.production?.

Changeset details

Core extensions: Object#present? et Enumerable#many?

DHH a aussi ajouté une extensions au core. C’est quelque peu trivial, mais peu rendre le code plus lisible. Le première est Object#present?, qui est essentiellement !Object#blank?

[].present? => false [1, 2].present? => true ””.present? => false “i’m here”.present? => true

Une extension Enumerable#many? a aussi été ajouté qui réalise simplement un test conditionnel sur enumerable.size > 1:

[].many? => false [:just_me].many? => false [:just_me, ‘my_friend’].many? => true

Object#present? changesetEnumerable#many? changeset

Syntaxe de block déclaratif pour l’écriture de tests

DHH s’est inspiré de Jay Fields quand il commita cette nouvelle syntaxe. Vous pouvez maintenant écrire vos tests (Test::Unit) avec un style de block déclaratif comme :

test “an anime should be invalid if any of its characters are invalid” do # Your usual test code here. end

J’utilise rarement Test::Unit (sauf pour soumettre des patchs à Rails) et préfère RSpec – Ce style déclaratif pour écrire des tests est vraiment plus lisible.

Tous les tests générés par Rails utilisent désormais cette syntaxe.

Changeset details

Performance tests

Jeremy Kemper a fait un travail en profondeur pour optimiser et améliorer les performances de Rails, alors c’est sans surprise que cela a été introduit comme nouveau type de test d’intégration. Les tests de performances.

Vous pouvez utiliser le générateur de test de performance (ajouté par Pratik dans 23232a) pour générer des tests de performances.

script/generate performance_test LoginStories

Le lancement du test de performance nécessite ruby-prof >= 0.6.1, qui n’est pas encore sortie. Mais vous pouvez récupérer sa version en développement à partir des sources et en installant vous même le gem (Je vous conseille de récupérer le ruby-prof que Jeremy a forké). Il est intéressant de remarquer qu’avec la sortie de ruby-prof 0.6.1, ruby-prof supportera le profiling des tests écrits avec Test::Unit

Attention - Si vous faites un petit code de test (requêtes sur plusieurs actions, quelque soit le cas d’utilisateur que vous voulez testez en performance) et lancez le test. Vous aurez la sortie suivante (si vous avez dirigé la sortie habituel de ruby-prof vers le répertoire test/tmp/performance de votre application Rails):

> ruby performance/login_stories_test.rb Loaded suite performance/login_stories_test Started LoginStoriesTest#test_homepage (32 ms warmup) process_time: 11 ms memory: unsupported objects: unsupported . Finished in 0.870842 seconds.

Les résultats memory et objects ne sont pas supporté, parce que je n’avais pas patché mon interpréteur Ruby au support du proflling de mémoire. Vous aurez besoin de patcher certain interpréteur ruby pour activer le profiling de la mémoire et de GC. Je souhaiterais vous en dire plus à ce sujet, mais je suis en terrain inconnu. Il y a plus de détail ici (en) sur la méthode à suivre pour patcher Ruby pour le profilling de la mémoire. Je laisse les personnes plus qualifiée sur ce sujet expliquer tout ça.

Changeset details

Outro

C’est tout pour le moment concernant les nouvelles fonctionnalités et changement dans Rails depuis Rails 2.1 - Les améliorations de performances arriveront dans un prochain post et j’ai laissé aussi intentionnellement de coté le support de Rack qui n’est que partiellement mergé dans Edge.

Si il y a des erreurs ou que vous avez des suggestions sur comment faire un meilleur post, s’il vous plait indiquez le en commentaire. Toute information sur le patch de l’interpréteur Ruby pour supporter le profiling de la mémoire et aussi le bienvenue. Si j’ai laissé de coté des éléments qui ne vous semblez pas le nécessiter, laisser moi un commentaire.