rspec-mocks を irb 上で利用するメモ

001 > require 'rubygems'
 => false 
002 > require 'rspec'
 => true 
003 > RSpec::Mocks.setup(self)
 => #<RSpec::Mocks::Space:0x007ff0ee055780> 
004 > o = Object.new
 => #<Object:0x007ff0ee059d80> 
005 > o.stub(:hoge){ true }
 => #<RSpec::Mocks::MessageExpectation:0x007ff0ee063a60 @error_generator=#<RSpec::Mocks::ErrorGenerator:0x007ff0ee064a00 @declared_as="Mock", @target=#<Object:0x007ff0ee059d80 @mock_proxy=#<RSpec::Mocks::Proxy:0x007ff0ee064a50 @object=#<Object:0x007ff0ee059d80 ...>, @name=nil, @error_generator=#<RSpec::Mocks::ErrorGenerator:0x007ff0ee064a00 ...>, @expectation_ordering=#<RSpec::Mocks::OrderGroup:0x007ff0ee0649b0 @ordering=[]>, @messages_received=[], @options={}, @already_proxied_respond_to=false, @null_object=false, @method_double={:hoge=>{:expectations=>[], :stubs=>[#<RSpec::Mocks::MessageExpectation:0x007ff0ee063a60 ...>]}}>>, @name=nil, @opts={}>, @expected_from="(irb):5:in `irb_binding'", @method_double={:expectations=>[], :stubs=>[#<RSpec::Mocks::MessageExpectation:0x007ff0ee063a60 ...>]}, @message=:hoge, @actual_received_count=0, @expected_received_count=:any, @argument_list_matcher=#<RSpec::Mocks::ArgumentListMatcher:0x007ff0ee063a10 @expected_args=[#<RSpec::Mocks::ArgumentMatchers::AnyArgsMatcher:0x007ff0ee063a38>], @block=nil, @match_any_args=true, @matchers=nil>, @consecutive=false, @exception_to_raise=nil, @args_to_throw=[], @order_group=#<RSpec::Mocks::OrderGroup:0x007ff0ee0649b0 @ordering=[]>, @exactly=nil, @at_most=nil, @at_least=nil, @args_to_yield=[], @failed_fast=nil, @args_to_yield_were_cloned=false, @eval_context=nil, @implementation=#<Proc:0x007ff0ee064ac8@(irb):5>> 
006 > o.hoge
 => true 

pry とか console とかはまぁ適当に。

Module#prepend

Module.prepend の意義を頻繁に見失って混乱するので以下の資料を読んで得た理解を纏める。間違っていたら指摘頂けると有り難い。

参照: https://speakerdeck.com/a_matsuda/ruby-2-dot-0-on-rails

元々 alias_method_chain は alias を活用した、メソッドそのものを後付けで拡張するためのメソッドだった。

class A でmodule B を include して、*module B が* class A のメソッドを拡張する形式で多用される。コアの部分のみをクラス側に書いて、module がそれを拡張していくという形式だ。

@waycats はalias_method_chain の複雑さを排除していくために、これを include を多用したスタイルで解決を図ろうとした。メソッドを後から拡張というスタイルは、例えばクラスの再オープンではメソッド自体が上書きされてしまうため、alias_method_chain を使うしか無かった。module 側がクラスのメソッドを拡張するにしても同じく alias_method_chain を使うしか無い。@waycats が行ったのは include で代用したことだが非常に判りづらい。結果として拡張される、というものであってコードを読むにあたり追いかけづらいという問題がある。このあたりは命名規則で解決できそうなものだかけれど、それは余りスマートなやり方には見えず、泥臭い(@waycats が悪いんじゃない)

メソッドの拡張は元々module やclass の継承関係によって行われていた。下位に属する class, module が上位の class, module のメソッドを拡張する形だ。問題は”上位の”という所であって、”同位の”メソッドを拡張できない事にある。

ここで prepend の登場になる。include が継承関係の上位に module を差し込んでいたのに対して prepend は下位に差し込む。こうすることによって対象のメソッドを呼んだ時に最初に prepend されたモジュールのメソッドが先ず呼ばれ、次に prepend を記述した class, module のメソッドが呼ばれる事になる。prepend を記述したクラスの同位にあるメソッドを拡張したことになるわけだ。

JVNが公開している連絡不能開発者一覧の開発者が作っている製品のリスト(長い)

JVN というサイトがありまして。大体の人は知っているだろうし見れば判るので説明は割愛。んで、報告された脆弱性情報をその作者に連絡してくれたりしてくれるんですが、連絡が付かない開発者が居る > 脆弱性が修正されない > みんな困る というコンボにはまってる案件が数多くあるわけです。

それが 連絡不能開発者一覧 というやつなんですが、素晴らしい仕事だと思うんですけれども「俺が欲しいのは開発者の名前じゃなくて製品の名前なんだよ…っ」と全く身勝手に思いまして、製品名抜き出してリストにしました。以下が今日時点のものです。つまり全部脆弱性があって治る見込みが立っていない。

続きを読む

jquery-color のインストール

jquery-color は背景色の animate とかに対応してくれる素敵プラグイン

で、インストールにはビルドする必要があるらしい。

ここで言うビルドとは js ファイルなどを繋げて minimize する作業のようだ。minimize する必要が無ければ、git リポジトリ上にあるjquery.color.js をそのまま使ってもいいんだけれど、そのままではバージョン番号が"@VERSION"という文字列のままで配置されてしまう。ビルドによってここに対象のバージョン番号が入るのでビルドする方が良い。欲しいバージョンは git checkout で該当するタグをチェックアウトする。

ビルドには grunt (js における make みたいなやつ)を利用するが、jquery-color が依存するライブラリ(というか js ファイル)を取得する必要があるようで、これには npm を使うそうな。npm は nvm のインストールによって既に付属している模様。

で、npm によってインストールしようと思ったら node のバージョンが古すぎると言われてしまった。あふん。

なので node を nvm によって更新する

nvm install v0.6.9
# デフォルトを0.6.9 にする
nvm alias default v0.6.9 

で、npm install すると node_modules 以下に多量のjs ファイルが展開される。

あと grunt が入ってなかったのでインストール

npm install -g grunt

んで、grunt 実行してみると、phantomjs が無いと怒られる。

phantomjs は npm 等では利用できないらしい。ダウンロードしてパスの通っている場所に配置する。

で、grunt すると無事ビルドとテストが完了するので dist/ 以下にビルドされたファイルを利用すれば良い。

Sprockets memo

rails の asset pipeline で使われている Sprockets の https://github.com/sstephenson/sprockets を読みながら各章毎にメモ。(=ちゃんとした翻訳ではないです)

ざーっと書いていきます。入門文書ではないかも。

ちなみに、Sprockets では複数の javascript や stylesheet を require や include で一つにまとめる事が出来るけれど、そのまとめる処理ないしまとめた結果を Bundle と読んでいる様子。以下の記述に於いてお同じ。

続きを読む