須藤です。

RSS Parser 0.1.7をリリースしました。
  http://raa.ruby-lang.org/project/rss/

0.1.7での新機能は以下の通りです。

  * Atomのサポート
  * RSS 2.0中のDublinCoreモジュールの正式サポート
  * 他のフィード形式に変換するための便利メソッドを追加

また0.1.7からruby 1.6.xのサポートを打ち切りました。


以下、長めの詳細です。

= Atomのサポート

Atomをサポートとは以下のことを含みます。

  * RSS::Parser.parseでAtomフィード文書を妥当性検証つきでパー
    スできる。
  * RSS::Parser.parseでAtomエントリ文書を妥当性検証つきでパー
    スできる。
  * RSS::Maker.makeでAtomフィード文書を生成できる。
  * RSS::Maker.makeでAtomエントリ文書を生成できる。

残念ながら、AtomサポートによりRSS Makerの以下の参照系のAPIの
挙動が変わりました。以前はStringかnilを返していたのですが、オ
ブジェクトを返すようになりました。

  * maker.channel.title
  * maker.channel.description
  * maker.channel.copyright
  * item.title
  * item.link
  * item.description
  * item.rights

ただ、0.1.6までのRSS Parser/RSS Makerの使いかたではこれらAPI
は使われていないだろうと思うので、影響は少ないと考えています。

= RSS 2.0とDublinCoreモジュール

今までは非公式にサポートしていましたが、0.1.7からは何もしな
くても使えるようになります。また、今までは以下のように各ファ
イルを別々にrequireして使うことを推奨していましたが、

  require 'rss/1.0'
  require 'rss/dublincore'

少し前のバージョンから

  require 'rss'

というようにするだけでフル機能を使えるようになっています。

= フィード形式の変換

フィード形式とはRSS 1.0とかRSS 2.0とかAtomとかのことを指して
いるつもりです。

0.1.7から他のフィード形式に変換するための便利メソッドを追加し
ました。これを使うと以下のようにRSS 1.0をRSS 2.0に変換するこ
とができます。

  rss10 = RSS::Parser.parse(File.read("1.0.rdf"))
  rss20 = rss10.to_rss("2.0")

RSS Parserはフィードの種類によらずRSS Parser.parseでパースで
きますが、パースしたフィードの種類毎に別のオブジェクトを返す
ため、パース結果を使うときに面倒なことがありました。

これに対する1つの解はフィードの結果によらない一般的なオブジェ
クトを返すというもので、いくつかの既存のRSS/Atomパーサが採用
しています。しかし、この方式では一般的なオブジェクトの設計な
どをかなり頑張らないとフィード特有の情報が抜け落ちてしまうか
もしれません。既存のパーサはそこらへんはうまく妥協点を見出し
ているようです。

RSS Parserが妥当性検証つきにこだわっていることからもわかると
おり、私は上記の方法の中途半端な感じが嫌でした。そこで、「パー
ス結果が使いにくい」に対する私の答えが「フィード形式の変換」
です。

ユーザは、パース結果を使用する前に、自分の好みのフィード形式
に変換します。以下の例では全てのフィードをRSS 1.0として扱いま
す。

  feeds = inputs.collect do |input|
    feed = RSS::Parser.parse(input)
    feed.to_rss("1.0")
  end

ユーザが欲しい情報はそのフィード形式が持っている情報のみであ
るといえます。つまり、フィード形式を変換するところを頑張れば、
ユーザが情報落ちを気にすることはなくなります。そこを頑張って
いるのがRSS Makerです。

しかし、フィード形式により必要な情報が異なるため、完璧に変換
できないこともあります。そのため、以下のように変換後のフィー
ドの内容をカスタマイズできます。例えば、以下の例は、変換元の
フィードにタイトルが設定されていない場合にデフォルトのタイト
ルを設定します。

  feed.to_rss("1.0") |maker|
    maker.title.content ||= "Unknown"
  end

以前のRSS Parserはこのように利用されてることはほとんどなかっ
たと思います。それが、私がRSS Makerの参照系のAPIはほとんど使
われていなかっただろうと予想している理由です。


最後に、RSS ParserがRubyの標準添付ライブラリに含まれているの
に別リリースなのは以下の理由からです。

  * APIに非互換性があるためruby 1.8.xには含めることができない
    気がする
  * でも、いろいろ使ってテストしてみて欲しい
  * trunkで動くものはruby 1.8.xでは動かない