What have you found for these years?

2008-10-10

status about MiniUnit

很多網頁喜歡弄一些熱鍵,用 javascript 綁架一些按鍵使得 web 不像 web...
例如 gmail, 綁架了 esc, 使得了 open vanilla 在按下 esc 取消輸入時,
會發生很可怕的狀況... blogger 亦然,按下 enter 有時就會送出,
害我常常發出打到一半的文章 -_-b

還有在 gmail 底下,shift + cmd + 左右切 tab 也偶爾會失效。
吃掉按鍵的網頁真的很討厭啊... 這樣不是也能竊取密碼嗎?
為什麼 browser 可以允許這種操作??上次 firefox 找外掛找半天,
沒有一個可以限制 javascript 到這麼細的地方。

我會關掉:
1. 跑馬燈
2. 任何吃掉按鍵的功能
3. 最小字型建制,safari 做得很好,firefox 這邊很失敗
不過,仍然是 mac 版的問題,記得 windows 和 linux 的 firefox 都是正常的。

同樣是純抱怨...
我仍然認為 web 就該有 web 的樣子,不要搞花俏,造成一堆困擾。
像是 redmine 的 issue update 用 javascript 開回應框,
乍看很炫,不小心按到上下頁的話,剛剛打好的就會不見。
如果是開新畫面的話,browser 都會保留剛剛打的字啊...

尤其是 backspace 有時候會變成 browser 的上一頁的熱鍵!

*

回主題,miniunit 是拿來取代 test/unit 用的。
理由很簡單,就是原本的 test/unit 的程式寫得很爛,
(喔靠,字型又跑掉了,這又是 mac 版 firefox 的問題...)
使得維護困難、擴充困難、執行速度緩慢、ObjectSpace 讓其他
ruby implementation 感到困擾,等等。例如 JRuby 預設就是關掉
ObjectSpace, Rubinius 有沒有支援有點忘了,但總之絕對是個困擾。
而 test/unit 有用到 ObjectSpace.

像是 test/unit 寫得不太妙的東西,其實還滿不少的。
例如 irb, rdoc, 都有各自的 parser...
ruby 的 standard library 如今充斥著各種包袱,很棘手。
1.9 的 spec 改變很多,這些 standard library 很多都是壞掉的,
需要全部重新檢視。因此,ruby-core 上有不少關於這些事情的討論。

有人說,反正 rubygems 那麼強,應該把 std lib 全部改成用 gem 釋出。
這樣的好處應該不用多說了。但是也有人反對,認為很多時候,
我們並不會有系統權限,而系統管理者,只會安裝預設的東西,
這時候我們就需要很強大的 std lib! 可能也是因此,rubygems 1.3 有新功能,
可以讓你安裝 gem 在自己的目錄下,如 /home/godfat/.gem 底下。

其實原本就可以讓你隨便選安裝路徑,只是現在就變成預設行為,
假使你沒有權限安裝 gem, 會自動灌到 /home/godfat/.gem 下,
而且由你執行的 ruby 程式,rubygems 會優先搜尋 /home/godfat/.gem

sudo gem install zzz # => 灌到系統裡
gem install zzz # => 灌到使用者目錄下

所以也許,std lib 真的都用 rubygems 處理,會是個不錯的選擇?

*

anyway, 總之 miniunit 就是拿來取代 test/unit 的。
作者是 Ryan Davis, 從他在 ruby-core 上的發言可以看出,
他在 miniunit 上付出相當多的心血。像是,他說他從幾年前開始,
就一直希望 miniunit 可以取代 test/unit, 但是沒有太多人在聽,
OOXX 等等辛酸血淚史..... 看了不禁讓人熱淚盈眶(誤)

因此,miniunit 也提供一個 test/unit 的 compatible mode.
希望以後當你說 require 'test/unit' 時,就可以直接使用 miniunit,
而 test/unit, 就讓他沉沒於歷史中吧!(作者很多很多年前就不維護了....)

也因此,ruby 1.9 在前一陣子,真的把 test/unit 扔了,
把 miniunit 直接取代 test/unit!!

Ryan Davis 認為反正是相容的,所以這樣的改變是可以接受的。
但問題是,整體架構就不同了,大家都知道 ruby 是高度動態的,
很多像是 mocha 等 test/unit 的擴充 library, 是有動到 test/unit 的
internal method, 意思就是,內部如果不相容,這些 lib 都會掛掉。

事實上也確實是如此,很多直接改寫 test/unit 的 lib, 在 miniunit 下是死的。
同時,Dave Thomas 也指出很多地方跟 test/unit 是不相容的。
也有人抱怨,miniunit 把 fail 這個 Kernel method 改寫掉了![1]

關於 lib 死掉的狀況,Ryan Davis 認為這些 lib 本來就不應該去碰 internal,
所以像是這樣相容,不是他應該要負責的部份。這點我沒有意見,畢竟架構改了,
內部要相容的難度太高,意義也不大。要相容到那種程度,不如繼續用 test/unit.

關於 Dave Thomas 提出的不相容,則是 Ryan Davis 沒有寫好,後來都修好了。
至於改寫 fail 這個 method, 則是 Ryan Davis 說他沒注意到有這個 method...
(註:fail 等同於 raise)

而且 Ryan Davis 也在 miniunit 上加入了一些他個人的看法。
在你使用 assert_raise 時吐出 deprecated warning,
說應該改用 assert_raises. 也就是他認為應該加個 s 比較符合文法。

這個又可以扯到很遠了。像是 rails 會要求符合文法,不過 ruby 本身的理念,
應該說 Matz 認為,所有的動詞都應該用 plain form. 所以是用
assert_raise, 還有 File.exist? 所有的動詞都謹記用基本型。

這一點,兩邊的支持者其實都不少,我個人也沒什麼偏好,各自有優點。
此外,使用 assert_not_ooo 也會吐出警告,要求你使用 refute_ooo.
關於這一點,不喜歡的人就很明顯比較多了。原因我也不多說了...
我個人也是覺得這樣很糟,而且很多人根本沒聽過 refute 這個字 XD

為了嘗試 miniunit 的人們,在換成 miniunit 後,
紛紛抱怨那恐怖無止盡的 deprecated warning. 因為只要用到一次就印一句。
於是眾人開始抨擊,不可以因為你的喜好,就做這樣的決定,等等。
最少最少,也應該讓警告訊息印一次就好,不要每次用到就印一次。
畢竟 test 幾千幾萬之下,那訊息真的是會多到可怕的程度。

另一方面,rubygems 的作者 Eric Hodel 也出來分享經驗,
原本他的作法就是只印一次警告,應該是 require_gem 那個 warning 吧。
可是如果如此善待 user, 就沒有人願意改。require_gem 那個警告不知道有多久了?
還真的是很多 lib 都完全不管那個警告.....

所以到底要不要善待使用者,有時候真的滿難抉擇的。

但總之,Ryan Davis 終於讓步了[2]。他把 test/unit 放回去,
然後增加 minitest, 當成一個全新的 library 來看待。
同時在文末說,他不會對此 thread 有所回應,
也不會回覆任何關於 miniunit 的事。他需要休息。

總覺得類似的事,好像很常在 ruby-core 上發生...
值得高興的是,大部份的人都很有風度,而且最後通常都會讓步。

另一方面,由於一直喜歡不了 rspec, 能有 miniunit 也是滿不錯的。

*

有些討論一時找不到在哪,下次找到的話再說吧 @@

[1] Mini Unit changing exceptions
[2] test/unit and minitest

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0