HTML-RSSAutodiscoveryのテストケースがアレな件


HTML-RSSAutodiscoveryモジュールをインストールしようとすると、テストに失敗するので調べてみた。割と周知の事実なのかもしれないけど。

どうもRSSAutodiscovery.pmの中の_check_syndic8というメソッドが空の配列返してしまっているのがテスト失敗の原因みたい。このサブルーチンではsyndic8というサイトで公開されているxml_rpcの関数を呼び出して、Feedのリストを取得している。syndic8の提供しているWebサービスを使わないんなら、このままforce installしてしまっても実害はなさそうだ。

まぁ、でもなんか気持ち悪いので、調べますよ。syndic8で提供されているxml_rpcの関数一覧は、Syndic8.com - Service Listで見れる。_check_syndic8で使われているのは、syndic8.FindSitesという関数とsyndic8.GetFeedInfoという関数だがどうも動作していないのはsyndic8.FindSitesであったのでコレの動作をテストするようなスクリプトを書いてみた。

#!/usr/bin/env perl -w
use strict;
use Data::Dumper;
use XMLRPC::Lite;

my $proxy = "http://www.syndic8.com/xmlrpc.php";
print 'input keyword: ';
chomp (my $kwd = <STDIN>);

# XMLRPC::Liteオブジェクトの準備
my $rpc = XMLRPC::Lite->new();
$rpc = $rpc->proxy($proxy); 

# syndic8.FindSitesの結果を取得
my $ids = $rpc->call("syndic8.FindSites",$kwd)->result();
#my $ids = $rpc->call("syndic8.FindFeeds",$kwd)->result();

print Dumper $ids;

しかし、いろんなキーワードを試してみた所、空の配列しか帰ってこない。似たような機能を持ったべつの関数syndic8.FindFeedsを実行してみると、ちゃんとIDを持った配列が返るんだが。

このHTML::RSSAutodiscoveryというモジュールは結構古いモジュールなので、当時はテストが成功していたのかもしれない。しかし、ついにsyndic8のxml_rpcの動きが変わって動かなくなったんじゃなかろうか。あくまでも推測だけれど。

さて、このFindSitesとFindFeedsはどうも似たような機能をもっていて、返す値も一緒のよう。ということで、RSSAutodiscovery.pmに以下のような変更を加えた。

$ diff RSSAutodiscovery.old.pm  RSSAutodiscovery.pm 
42c42
< use constant SYNDIC8_FINDSITES => join(".",SYNDIC8_CLASS,"FindSites");
---
> use constant SYNDIC8_FINDFEEDS => join(".",SYNDIC8_CLASS,"FindFeeds");
369c369
<   my $ids  = $rpc->call(SYNDIC8_FINDSITES,$1)->result()
---
>   my $ids  = $rpc->call(SYNDIC8_FINDFEEDS,$1)->result()

これで、テストが成功するようになった。しかし、モジュール本来の意図からはずれてしまうよね、これ。

さて、いきなりだが結論。こんな苦労して修正してみたものの、やはり、完璧には修正できない。しかも、この_check_syndic8メソッドを使うような部分はあまり使わなさそうな部分だ。HTML::RSSAutodiscovery::locateにnoparse=>1もしくはsyndic8=>1オプションを渡した場合_check_sydic8が使われる。というわけで、素直に、

cpan> force install HTML::RSSAutodiscovery

で何もかも解決だ。あれ、こんなオチですか。