fastladder を読む (0) - はじめに
しばらく読みふけっていきます。fastladder カテゴリで。
http://fastladder.org/download.html にあるソースの 0.2.0 MacOSX のもの。
読み終わったときにはウィジェットができるような気がします。
fastladder を読む (1) - migration
まずはデータ構造から。といってもmigrationファイルを読むのはアレなので,
$ rake db:create $ rake db:migrate $ railroad -i -l -m -M | dot -Tpng > doc/models.png
とおもむろにモデルを図にするとわかりやすい。ということでついでに添付。
FeedとItemはそのままRSSなりATOMなりのFeed文書とその中のItemということ。FaviconとCrawlStatusはFeedと1:1なので一緒に観た方がいい。わざわざテーブルを分けている理由は分からなくもない。FolderというのがFeedとN:Nなので、これはカテゴリっぽいものというよりはタグっぽいイメージがある。Subscription は MemberとFeedを関連づけるための中間テーブルにいろいろ情報を載っけたやつ。Pinは今のところ謎。
ということで、中央のFeedからみていこう。
fastladder を読む (2) - app/model/feed.rb
icon メソッドはパスの解決。これはHelperに書くかModelに書くかいつも迷ってしまうんですが、こんなものなのかな?フルパスで書いてあるので、おそらく img src などに使うんだろうけど。
to_json メソッド。これはとりあえずパス。わざわざ上書きしてるのだから、おそらくAjaxで使っているのかと。
%w(title description).each do |s| result[s.to_sym] = (self.send(s) || "").purify_html end %w(feedlink link image).each do |s| result[s.to_sym] = (self.send(s) || "").purify_uri end
で、purify_* はいわゆるエスケープ作業。lib/string_utils.rb に定義があって、Stringクラスにメソッドを追加しています。ちなみに、この lib/string_utils.rb で
def sanitize_uri begin uri = URI.parse(self) rescue URI::Error => e return "" end case uri when URI::Generic, URI::HTTP, URI::HTTPS, URI::FTP, URI::MailTo return uri.normalize.to_s else return "" end end
なのもあるので、URI は場合によっては消える可能性が... feedlink,link,image のどれにもvalidationがついていないので後で動かして確認する。
subscribed は メンバーがそのFeedを購読しているかどうかを確認するメソッド。member.subscribed(feed) に投げるだけ・・・ん、subscribed, -ed? まあいいや。
update_subscribers_count は購読メンバー数を更新するメソッド。
で、メインは crawl メソッド。
def crawl crawl_status = self.crawl_status CrawlStatus.transaction do if crawl_status.status != Crawler::CRAWL_OK return end crawl_status.update_attribute(:status, Crawler::CRAWL_NOW) end begin Crawler::crawl(self) rescue => ex logger.error "Crawler error: #{ex}" ensure crawl_status.update_attribute(:status, Crawler::CRAWL_OK) end end
ん、、、、transaction? これはあってもなくても、の話で、trunk のほうは 3/7 時点で無くなってます。で、Crawlerをみると。
fastladder を読む (3) - lib/crawlwer.rb / 1
基本的には Net::HTTP でとってきて、フィードのXMLパースして、結果をFeed/Itemオブジェクトにぶち込むだけですが。。。
結構しっかり作ってあって、If-Modified-Since をちゃんとつけてくれるし、Accept ヘッダーも。Basic 認証もするようですね。などをみていきます。FeedNormalizer や hpricot などの使い方のよい参考になりそうかな。