planet.rubyfr.net

J’ai mis à jour, il y a de cela une petite semaine, le site planet de la communauté Ruby et Rails Francophone. Au programme : principalement la mise à jour du plugin FeedWordPress et le (re)paramétrage de ce dernier. Les feeds atom sont maintenant correctement supportés et n’apparaissent plus en double ; comme ce fut le cas avec les posts de notre ami Nicolas (Mérouze) en provenance de son magnifique blog : Boldr.

Si vous souhaitez que votre blog soit ajouté, n’hésitez pas à m’envoyer un mail à “gregoire point lejeune (at) free point fr”

Bonne lecture à tous…

XSD (hors annotation)

XML Schema

SOAP::LC 0.0.1

Non, elle n’est pas dispo… Mais j’y aie travaillé, et pour le moment cela fonctionne plutôt bien malgré le fait que je ne gère que les parties de messages type simpleType. Il me reste à ajouter la gestion des types complexes et des éléments. N’étant pas un pro des Schéma XML, je me suis commandé un petit livre sur le sujet… Cela laisse présager de bonnes soirées en perspectives ! Je pense avoir quelque chose de fonctionnel rapidement, mais si je met à disposition une première version avant d’avoir parcouru les 412 pages, j’ai peur que cela soit un peu du bricolage ;)

SOAP::LC et Rails

Le développement de SOAP::LC avance doucement (il est 0h54 aussi, c’est Ruby time!) Je me suis, pour le moment, beaucoup amusé avec les WebServices Rails. Ils présentent une particularité gênante. En effet une méthode déclarée hello_world sera rendu, via la WSDL générée par Rails, sous le nom HelloWorld. Ceci implique donc d’avoir un appel sous la forme :

s = SOAP::LC.new( ).wsdl( "http://localhost:3000/sample/wsdl" ).HelloWorld( :from => "Greg" )

L’appel à HelloWorld est bien récupéré via method_missing. La preuve :

>> class Test
>>   def method_missing( id, *args )
>>     puts "Appel de #{id.id2name}(#{args.join( ", " )})"
>>   end
>> end
=> nil
>> t = Test::new
=> #<Test:0×598684>
>> t.HelloWorld( "Greg", 2 )
Appel de HelloWorld(Greg, 2)
=> nil

C’est une bonne nouvelle… Surtout pour moi qui aie toujours pensé qu’il n’était pas possible de déclarer de méthode dont le nom commence par une majuscule :

>> class Test2
>>   def HelloWorld( from )
>>     puts "Hello World par #{from}"
>>   end
>> end
=> nil
>> t2=Test2.new
=> #<Test2:0×58fdf4>
>> t2.HelloWorld( "Greg" )
Hello World par Greg

Ha ben si ! En effet la méthode HelloWorld a bien été référencé au niveau de la classe comme méthode publique d’instance :

>> Test2.public_instance_methods
=> ["inspect", "clone", "method", "public_methods", "instance_variable_defined?", "equal?", "freeze", "to_yaml_style", "methods", "respond_to?", "dup", "to_yaml", "instance_variables", "__id__", "object_id", "eql?", "to_yaml_properties", "require", "id", "singleton_methods", "send", "taint", "frozen?", "instance_variable_get", "require_gem", "__send__", "instance_of?", "taguri", "to_a", "type", "taguri=", "protected_methods", "gem", "instance_eval", "==", "display", "===", "instance_variable_set", "kind_of?", "extend", "to_s", "HelloWorld", "hash", "class", "private_methods", "tainted?", "=~", "untaint", "nil?", "is_a?"]

Mais que se passe-t-il ?
- Mais que se passe-t-il ?
- Mais qu’est-ce qui se passe ?

J’en était resté à la sacro-sainte règle de Ruby in a Nutshell disant que si un identifiant commence par une majuscule, c’est une constante. Puis j’ai relu un peu de documentation et j’ai compris que j’avais tout faux. Et c’est logique en fait : un nom de méthode c’ets bien constant. Cela dit cette permissivité du langage est dangereuse. J’ai donc ajouté une méthode call à la classe SOAP::LC::Request permettant de faire le même appel sous la forme :

s = SOAP::LC.new( ).wsdl( "http://localhost:3000/sample/wsdl" ).call( "HelloWorld", :from => "Greg" )

Au moins cela permet de conserver les conventions. et puis j’ai appris quelque chose…

Moi qui avais placé en priorité basse la relecture approfondie de Programming Ruby, je vais immédiatement la remettre en priorité 1… Enfin si Monsieur est d’accord !