Rails ça rox ! Mais comme pour tout, il faut correctement l’utiliser.
Et pour cela, il faut faire des test. Pas manuels, mais automatiques. Je vous laisse découvrir cela.

Cependant il y a certaines choses qui ne sont pas forcément pratiques à tester, tel que l’envoi d’un fichier.
Vous avez besoin d’un objet spécial toussa. Pas bien difficile dans l’idée. Mais tellement chiant pour un bon fainéant comme moi ;-)

Si vous avez lu l’article donné plus haut, vous avez vu la page « Testing Files Upload » qui, fonctionne bien.
Ou presque, malheureusement.
En effet l’attribut content_type est, dans « la vraie vie », modifiable. Et ici, il est disponible uniquement en lecture. C’est bête, ça fait planter votre test alors que l’application fonctionne bien.

Mais il y a une solution heureusement ! La voici :)
En cherchant un peu, j’ai découvert que Rails propose une méthode permettant de tester l’envoi de fichier, méthode qui est disponible en interne.

ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + 'myfile.jpeg', content_type)

Ok, cool. Si vous testez cela déjà, vous constaterez que vous avez correctement votre objet pour tester le fichier envoyé. Super !
Seulement vous ne pouvez toujours pas modifier la valeur de content_type. Alors que l’objet retourné par un vrai fichier envoyé le permet.

Allons donc un petit peu hacker Rails.
Ouvrez le fichier RUBY_PATH/gems/1.8/actionpack-2.0.2/action_controller/test_process.rb

Puis cherchez la déclaration de la class TestUploadedFile
La, vous verrez la ligne suivante :
attr_reader :content_type

Nous avons donc l’attribut content_type en lecture. Passons le en lecture-écriture :
attr_accessor :content_type

Et hop ! Vous pouvez maintenant tester votre envoi de fichier tout en modifiant le content_type :)
Et moi dès que j’aurai trouvé un client GIT potable sous Windows, je pourrais proposer le hack à l’équipe de développement de Rails.

[Edit : Après avoir récupéré la dernière nightly build de Rails, le bug du attr_accessor a été corrigé. Si vous avez la dernière version de Rails, il n'est donc pas utile de faire cela]

En ruby, il est très facile de compter le nombre de jours entre deux dates.

date1 = 1.month.ago
date2 = Date.today
puts date2-date1

Cependant il peut arriver que vous ayez besoin non pas de calculer le nombre de jours entre deux dates … Mais le nombre de jours de semaine (du lundi au vendredi) entre deux dates.
Dans le cas d’un extranet pour calculer le nombre de jours travaillés, cela peut s’avérer très utile :)

Vamos ! Placez, dans votre code (dans l’idée, n’importe ou. Mais mettez le à un endroit ou vous le retrouverez. Sinon, vous allez rapidement perdre le contrôle de votre application) :
class Date
def weekdays_until(date)
return 0 if date <= self
(self..date).select{|day| day.is_weekday?}.size
end
def is_weekday?
self.wday != 0 && self.wday != 6
end
end

Et pour l’utiliser :
1.month.ago.weekdays_until(Date.today)

Cool non ? :)

Que faisons-nous ?
Nous surchargeons l’objet Date en y ajoutant deux nouvelles méthodes :
- is_weekday? qui nous retourne true si on est du lundi au vendredi.
- weekdays_until qui nous calcule le nombre de jours du lundi au vendredi seulement.

Evidemment, cela ne prends pas en compte les vacances scolaires ;)

Note : les « tricks » 1.month.ago ne sont disponibles que si vous êtes dans un environnement Rails. Dans le cas contraire, il vous faudra calculer la date passée manuellement

Désolé pour la mauvaise qualité de la photo, prise avec mon nokia e71 à la fnac.

Arrivée prévue fin 2008 – début 2009 …

J’ai tendance à ne pas apprécier le contenu que Eric Dupin place sur son blog, presse-citron.
Pseudo-expert qui fait des billets sur des sujets qu’il ne maitrise pas dans le but de rentabiliser un blog lu par des gens qui le fanatisent. Très peu pour moi.

Cependant je suis plutôt d’accord avec son dernier billet, fermé pour cause d’inventaire.
Passons tous le problème personnel.

Mais le web est constitué de boulets trollers qui s’imaginent être à l’abri de tout derrière leur écran. Alors que comme tout sur le web, l’anonymat y est virtuel. Et Eric n’est pas le seul à subir ces boulets qui sont très forts dans la critique négative mais ne connaissent pas la critique constructive.

Comme exemple, je prendrais simplement le cas du forum dmoz sur WebRankInfo, dont la seule utilité était de permettre aux webmasters de s’informer sur l’ODP et de converser de manière directe avec les éditeurs.
Ce forum a été fermé il y a de cela un an et demi suite justement à ces trollers qui rendaient sa gestion intenable.
J’y était modérateur à cette époque. Et les trolls à cet endroit étaient plus que déprimants de mon point de vue d’éditeur.

Alors monsieur Dupin, mon seul message, c’est : tu n’es pas tout seul à supporter ce genre de messages quasi permanence. Courage. Tu verra avec le temps, tu apprends à simplement les ignorer et les oublier 3 secondes après les avoir lus.

Note : j’ai des problèmes de batterie en ce moment. Impossible d’utiliser mon appareil jusqu’à ce que deux colis qui viennent de Hong Kong soient arrivés à Lyon. Donc en attendant, pas de photo de fin d’article. Désolé.

J’étais, hier, aux ateliers de Paris Web 2008. Petit compte rendu des divers ateliers auxquels j’ai participé :)

Javascript De(ux) Zéro
mat nous proposait un rappel pas superflus des bases de Javascript, de ses fonctionnalités avancées, des diverses incompatibilités inter navigateurs et des évolutions du langage.

Performance Web côté client
Eric Despet et Nicole Sulivan ont pris divers sites en exemple afin de les analyser, de signaler leurs problèmes de performances et de proposer des solutions pour les corriger.

Comment rendre mes vidéos accessibles ?
Sébastien Delorme nous présentait les diverses manières de rendres des vidéos (diffusées sur le web ou pas) accessibles. Création et synchronisation de sous-titres, création et synchronisation de commentaires audio.
Application de ces sous-titres et commentaires audio dans RealPlayer et dans divers lecteurs flash.

Optimiser ses CSS
Pascale Lambert-Charreteur, assistée de Stéphane Deschamps et d’un troisième que je ne connais pas, nous présentaient diverses techniques afin de préserver sa feuille de style CSS propre, lisible et légère.

A tous ces ateliers plus intéressants les uns que les autres, il faut ajouter :
Un repas le midi avec Pascal Martin, gérant de la société Linterweb qui développe notamment Wikiwix (et plein d’autres choses en rapport avec la recherche et/ou Wikipédia).
Un repas sympa, passé à discuter de ses divers projets et de ses évolutions futures.

Puis pour finir la soirée en beauté, j’ai retrouvé tuisp, inistea, rome et sahinler pour un repas entre éditeurs dmoz.

Malheureusement, pas de photos de ce week-end à Paris. En effet, bien que j’ai mis la batterie de mon appareil à recharger jeudi toute la journée et que je ne l’ait pas utilisée entre temps, je me suis rendu compte samedi matin que je n’avais plus d’énergie.
La raison exacte de ce déchargement aussi rapide est encore un mystère. Mais que je résoudrai bientôt. Désolé, la photo de fin d’article n’est donc pas récente.

Aujourd’hui, je renouvelle l’un de mes noms de domaine. Par carte de crédit bien évidemment.
Et la, pour la première fois, ma banque, le Crédit Agricole, me demande de définir un mot de passe que je devrai apparemment retaper à chaque utilisation de ma carte.

Sur le coup, je me dis « ouah, super idée. Enfin la faille de sécurité énorme au niveau des paiements par carte bancaire sur Internet ne demandant pas de code va être corrigée ».

Je tape donc un code. Et la, surprise !
Il y a des conditions requises au niveau du mot de passe.

Mais, contrairement à ce que l’on est habitué à avoir, c’est à dire des conditions favorisant la sécurité, on a ici le contraire.

  • Le code ne peut contenir que des caractères alphanumériques.
  • Il a une longueur de 6 caractères. Pas plus, pas moins.
  • Il doit contenir au moins un chiffre et une lettre.

Rien à redire sur le dernier. C’est les deux autres qui sont nuls.
Pourquoi limiter à 6 caractères ?? Encore dire « 6 caractères minimum », je comprendrais. Mais si j’ai envie de mettre un mot de passe à 8 caractères, c’est plus sécurisé et ça coute pas plus cher.

Et pourquoi limiter aux caractères alphanumériques ? Si j’ai envie de mettre un « ; » ou un « ^ » dans mon mot de passe, en quoi ça gène le stockage ou que ce soit ??
Les banques ont 10 ans de retard d’un point de vue sécurité. Et pourtant on ne peut pas dire que les données qu’ils font transiter ne sont pas sensibles.

Je publie ce billet un peu rapidement comme une note car j’ai eu du mal à trouver l’information lorsque j’en ai eu besoin.

La documentation de Zend Framework n’indique que les informations de connexion pour SQLite dans app.ini.
Mais tout le monde n’utilise pas SQLite (et pour donner un avis totalement personnel, je dirais heureusement).

Voici donc les informations requises pour la configuration de MySQL dans votre application utilisant Zend Framework.

[general]
database.adapter = "MYSQLI"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Et puis rien que pour le fun, Oracle :
[general]
database.adapter = "Oracle"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

SQL Server
[general]
database.adapter = "Pdo_Mssql"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Et PostgreSQL
[general]
database.adapter = "Pdo_Pgsql"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Vous le savez probablement déjà (sinon, je ne peux que vous conseiller de voir les bases de Ruby on Rails) comment il est facile de valider des données avec notre framework préféré :)

if mesDonnees.save
#Les données ont bien été sauvegardées
else
# Il y a une erreur. mesDonnees.errors la contient il n'y a plus qu'à l'afficher.
end

Après, il n’y a plus qu’à ajouter des paramètres de validation des données dans le modèle.
Mais maintenant, supposons d’autres cas de validation un peu particuliers, qui ne rentrent pas dans le cas « normal ».

Vous n’avez qu’à créer une nouvelle méthode qui valide vos données (l’exemple ci-dessous est totalement bidon) :

def validates_roxitude(*attribut)
reg = Regexp.new '/^ruby(.*?)rox$/'
self.errors.add('rox', 'Hey, Ruby ça rox. Faut le dire !') unless reg.match attribut
end

Ici, nous mettons donc une erreur sauf si le champ « monChamp » commence par ruby et se termine par rox.

Il n’y a plus qu’à forcer la validation avec cette méthode et le tour est joué !
class monModel < ActiveRecord::Base
validates_roxitude :monChamp
end

 
Fork me on GitHub