glob

Aller au contenu | Aller au menu | Aller à la recherche

lun, 23 juin 2008

Fixtures on Rails 2.1

Suite à mon précédent billet concernant la création d'un jeu de données propre à une migration en utilisant les fixtures ainsi qu'aux nouveautés concernant les migrations dans rails 2.1, quelques ajustements ont du être effectués.

Les fichiers de migrations sont désormais préfixées par un timestamp (exemple : db/migrate/20080618211857_create_admin_user.rb) et non plus par un simple identifiant incrémental. Vos fichiers de fixtures doivent désormais être préfixés par ce même timestamp (exemple : db/fixtures/20080618211857_users.yml).

Voici donc le script lib/create_fixtures.rb mis à jour :

require 'active_record/fixtures'

module CreateFixtures

FIXTURES_LOCATION = File.dirname(__FILE__) + '/../db/fixtures'
MIGRATIONS_LOCATION = File.dirname(__FILE__) + '/../db/migrate'

def self.extended(object)
class << object
alias_method :migrate_without_fixtures, :migrate unless method_defined?(:migrate_without_fixtures)
alias_method :migrate, :migrate_with_fixtures
end
end

private

def current_migration
version = ActiveRecord::Migrator.current_version
index = migration_files.find_index do |f|
version = '%03d' % version if version.to_s.size < 3
f =~ /\/#{version}_/
end
file = index ? migration_files[index + 1] : migration_files.first
file.gsub(/.*\/(\d+)_.*/, '\1')
end

def fixture_files
@fixture_files ||= Dir["#{FIXTURES_LOCATION}/[0-9]*_*.yml"].sort
end

def migration_files
@migration_files ||= Dir["#{MIGRATIONS_LOCATION}/[0-9]*_*.rb"].sort
end

public

def migrate_with_fixtures(direction)
migrate_without_fixtures(direction)
return if :down == direction
migration = current_migration
cnx = ActiveRecord::Base.connection
file = fixture_files.find do |f|
f =~ /\/#{migration}_/
end
return unless file
table_name = file.gsub(/.*\/\d+_(.*)\.yml/, '\1')
Fixtures.new(cnx, table_name, nil, file.gsub(/(.*)\.yml/, '\1')).insert_fixtures
end

end

ActiveRecord::Migration.extend(CreateFixtures)

Note : Cette version est compatible avec les anciennes version de rails.

dim, 27 avr 2008

iSport

Voici une petite appli Web adaptée pour iPhone / iPod Touch : iSport.

Elle permet d'avoir les informations sportives ainsi que les résultats des matchs en direct (pour l'instant, que Fooball, Tennis, Basket US et Rugby).

La chose utilise Ruby, Rails, Hpricot et comme d'habitude : Prototype.

Quelques screenshots pour la peine :

Des retours et / ou commentaires sont les bienvenus !

mar, 15 avr 2008

mount /dev/null

Ce matin un collègue a trouvé un gentil mot de notre administrateur système :

ven, 29 fév 2008

Diff SVN

En regardant le script de davux, permettant la colorisation d'un diff, je me suis dit qu'il devait y avoir une possibilité d'intégrer ça de manière simple à subversion.

Collez ce petit script dans un fichier (nous allons prendre ici /usr/local/bin/colorized_diff) et rendez le exécutable :

#! /bin/sh

plus='^[[0;32m'
minus='^[[0;31m'
diff "$@" | sed 's/^+.*$/'"$plus"'&^[[0m/; s/^-.*$/'"$minus"'&^[[0m/'

Ensuite, modifiez le fichier ~/.subversion/config pour y rajouter ou modifier la ligne suivante dans la section [helpers]:

diff-cmd = /usr/local/bin/colorized_diff

Vous pouvez omettre le chemin (/usr/local/bin) si il est dans votre PATH. Maintenant, un svn diff dans un shell vous affichera les lignes supprimées en rouge et les lignes ajoutées en vert. C'est pas plus mignon ?

Note : ^[ est le caractère d'échappement, vous pouvez le taper dans vim en faisant Ctrl-V puis Echap

mar, 10 juil 2007

Fixtures on Rails

Il est assez fréquent d'avoir du contenu à pré-remplir dans une base de données lors du déploiement d'une application.

La plupart du temps on se fait un script SQL qui fait les insertions. En Rails, c'est mieux, on mets les insertions dans les scripts de migration et ça roule.

Petit hic, mettons que l'on a beaucoup de données et contenant des champs text, le script de migration va vite devenir illisible. Pour ça il y a les Fixtures. Seulement, ce n'est pas géré par les migrations (de base). Les fixtures sont représentés grâce à des fichiers YAML décrivant vos modèles.

Voilà un petit script à rajouter dans le répertoire /lib/ (nommez-le create_fixtures.rb) :

require 'active_record/fixtures'

module CreateFixtures

FIXTURES_LOCATION = 'db/fixtures'

def self.extended(object)
class << object
alias_method :migrate_without_fixtures, :migrate unless method_defined?(:migrate_without_fixtures)
alias_method :migrate, :migrate_with_fixtures
end
end

def migrate_with_fixtures(direction)
migrate_without_fixtures(direction)
return if :down == direction
version = ActiveRecord::Migrator.current_version + 1
cnx = ActiveRecord::Base.connection
files = Dir["#{FIXTURES_LOCATION}/[0-9]*_*.yml"].each do |file|
next unless file.gsub(/.*\/([0-9]+)_.*\.yml/, '\1').to_i == version
table_name = file.gsub(/.*\/[0-9]+_(.*)\.yml/, '\1')
Fixtures.new(cnx, table_name, nil, file.gsub(/(.*)\.yml/, '\1')).insert_fixtures
end
end

end

ActiveRecord::Migration.extend(CreateFixtures)

Ensuite, rajouter cette ligne dans le fichier config/environment.rb :

require File.dirname(__FILE__) + '/../lib/create_fixtures'

Voilà la chose est en place. Maintenant voyons l'utilisation.

Vous avez juste à créer un répertoire db/fixtures dans votre application et y mettre vos fichiersYAML. Nommez vos fichiers de la sorte :

<numéro_de_migration>_<nom_de_la_table>.yml

Rien de mieux qu'un petit exemple :

$ cat db/fixtures/002_users.yml
admin:
login: admin
hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
status: administrator

Ici, l'utilisateur administrateur sera directement ajouté à la fin de la deuxième migration. Vous pouvez bien-entendu mettre plusieurs fichiers de fixtures pour une même migration et créer des utilisateurs par exemple après la deuxième ou même la 42e migration.

lun, 19 fév 2007

Mieux que OS X et Vista réunis : linux

Beryl

sam, 25 nov 2006

Un peu de lecture...

bien_developper_pour_le_web_2.0.jpg

Merci TDD de nous avoir gentillement offert et dédicacé ton ouvrage, que j'ai impatiemment commencé à dévorer, et l'avant-propos (ainsi que la préface) annonce déjà bien la chose. Une belle mise en bouche. Mais bon, 555 pages, ça ne se lit pas d'une traite. C'est là que je regrette de ne pas avoir assez de temps de transport...

Parmi les nombreux chapitres, ceux qui m'alèche le plus sont le décorticage des APIs prototype et script.aculo.us ainsi que REST, surtout voir comment l'auteur aborde ces thèmes. Ce qui est bien c'est que l'homme rentre bien dans les détails techniques, et explique pourquoi faire ça et non cela, au lieu d'émettre le classique « c'est mal ! ».

A en avoir lu les critiques et en connaissant les talents de l'auteur au niveau pédagogique j'attends vraiment de voir comment il a abordé ces sujets, à la fois complexes et variés. Comme le dit Tristant Nitot et les critiques, c'est le « bien développer » qui me semble le plus important, et là on peut trouver une différence parmi ce que l'on peut trouver. On manquait d'un ouvrage Best Practices sur les technos Web, Web 2.0, HTML, XHTML, CSS, DOM, AJAX,... et voilà c'est fait, et le tout réuni dans ces quelques 555 pages !

En feuilletant l'ouvrage on peut remarquer que les noms pour les exemples ne sont pas choisis au hasard, et ça donne le sourire. On peut trouver entre autres Valérie, Emmanuel, Marie-Hélène, Nioute, Adrien, & co. C'est mignon :).

Chapeau bas l'artiste et bon courage pour le suivant ;)