
今、お昼休みでご飯を食べながら書いてます。
あとで清書するとして覚え書き。

su - root
gem install mechanize
gem install parsetree ruby2ruby
gem install scrubyt
gem install ParseTreeReloaded
最後の1行は公式サイトのインストール方法には記載されていないので注意してください。公式フォーラムに解決策が載っています。
LoadError: no such file to load -- parse_tree_reloaded - scRUBYt!
これで問題ないはずなんですが、自分の環境にopensslが入ってなかったので、もうひとハマり。結局opensslの開発向けパッケージを入れて、Rubyを再コンパイルしたらうまくいきました。せっかくなので、最新パッチを適用してみます。(RubyKaigi2007開催中にリアルタイムリリースされた品です)
sudo apt-get install openssl libssl0.9.7 libssl-dev
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p36.tar.gz
tar zxvf ruby-1.8.6-p36.tar.gz
cd ruby-1.8.6-p36
./configure
make
make test
sudo make install
これでirbでrequire 'scrubyt'が成功。ようやく遊べる。
半日ほど触ってみました。ドキュメントや機能に不足を感じる部分はありますが、ソースコードを読めばわかる程度の分量です。非常に楽しいライブラリでした。
早速、自サイトから読書履歴を抽出するスクリプトを作ってみました。
require 'rubygems'
require 'scrubyt'
mysite_data= Scrubyt::Extractor.define do
fetch 'http://blog.studiohff.net/'
click_link '読書'
book do
date '2007/06/10 22:06:34'
title '「サイエンス夜話 不思議な科学の世界を語り明かす」 読了'
readtime '3時間半'
end
end
mysite_data.to_xml.write(open('result.xml', 'w'), 1)
出力はこんな感じ
<root>
<book>
<date>2007/06/10 22:06:34</date>
<title>「サイエンス夜話 不思議な科学の世界を語り明かす」 読了</title>
<readtime>3時間半</readtime>
</book>
<book>
<date>2007/04/24 01:36:13</date>
<title>「Subversion 実践入門 第2版」を第1版と読み比べてみた</title>
</book>
ハマった原因のほとんどは、英文読解能力の不足。公式サイトのサンプルがもっと多いと、英語が読めなくても雰囲気が掴めるので助かるなぁ、とは思います。
機能面で不足していると感じたのは、
mysite_data.book[0].dataという表現が出来るのに、mysite_data.book.each doは使えない。配列っぽくアクセス出来るなら、イテレータは欲しいところです。



def get_tr_class( result )
return "tr_past" if result.release_date.blank?
now_term = 14 # Days
future_border = now_term.days.since.strftime('%Y/%m/%d')
today = Time.now.strftime('%Y/%m/%d')
past_border = now_term.days.ago.strftime('%Y/%m/%d')
if result.release_date < past_border
"tr_past"
elsif result.release_date > future_border
"tr_future"
elsif result.release_date <= future_border && result.release_date > today
"tr_soon"
else
"tr_now"
end
end
ところが、Railsってhelperのテストを行う箇所がないのですね。行いたいテストはunitテスト程度の単純なもの。functionalテストでデータを用意し、responseから該当部分を探すという手もあるけど、ちょっと大袈裟すぎ。
色々考えた結果、プリミティブなオブジェクトを作って、それにhelperの機能を追加してみた。
def test_get_tr_class
helper = Object.new.extend(ReleaseHelper)
r = Result.new( :release_date => 15.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_future", helper.get_tr_class( r )
r = Result.new( :release_date => 14.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_soon", helper.get_tr_class( r )
r = Result.new( :release_date => 1.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_soon", helper.get_tr_class( r )
r = Result.new( :release_date => Time.now.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date => 1.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date => 14.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date => 15.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_past", helper.get_tr_class( r )
r = Result.new # release_date is blank
assert_equal "tr_past", helper.get_tr_class( r )
end