2014/06/27

gem 開発が少し便利になる .pryrc

gem の動きを pry で確認するのはよくあることで、
pry(main)> $LOAD_PATH.unshift './lib'
pry(main)> require 'my_gem'
みたいなのを毎度やっていた。
誰かの gem の挙動を確認したいなーというだけならまだいいけど、自分で開発している時に何度もやるのはめんどくさい。
そんな時に役に立つのが .pryrc こんなのを書いておいた。
カレントディレクトリに my_gem.gemspec ファイルがあれば gem だと判断し、 lib/my_gem.rb があれば自動的に require してくれる。

2014/06/25

Gemfile.local を使う

例えばこんな Gemfile を書いていて push したら、CI でpry-byebug は Ruby 2.0 以降でないと動かないと怒られた。
ローカルでは、2.1.2だから気が付かなかった。

そこでこんなふうに修正して開発してた。
そしたらある日 binding.pry を消し忘れて push してしまいテストが終わらなかった。

CI が当たり前となった現在、こういう Gemfile は無駄が多いんじゃなかろうか。
pry-byebug などのデバッグツールはテストの時に必須なのではないので、CI時には無視したい。
おそらくそのための機能が group なんだろうけど、環境に応じて bundle install のオプションをあれこれしなければいけないのはちょっとめんどくさい。できれば bundle install と path などの使い慣れたオプションだけで完結させたい。

で、話変わって Redmine には Gemfile.local という仕組みがあって、Redmine の実行と直接関係ない gem を記述する方法が用意されている。
Redmineのインストール — Redmine Guide 日本語訳 によると、Redmine本体は使用しないgem(例: mongrel, fcgi)もロードしたい場合のための仕組みらしい。
せっかくなので、Redmine 以外の開発でも導入してみよう。
こんな感じで Gemfile と Gemfile.local を作り、.gitignore に Gemfile.local を指定する。
CI時に不要な gem がダウンロードも読み込みもされることはないし、ローカルの開発ではデバッグできる。
bundle install する時に余計なオプションもいらない。
大体、デバッグツールなどは使い慣れたものが個人個人にあって、誰かの設定に左右されるべきものではない。

ただし、当然デメリットもあってコレを許すということは個人個人の開発環境で差異が出ることを意味する。
なので、余計なトラブルが起こる可能性も多少あがる。
まあ、それは使う使わないの選択の問題であって、仕組みとしてはあったほうが便利だと思う。

2014/06/19

MacVim の Ruby 連携

MacVim で Ruby との連携がいつの間にか取れなくなって、結構前から todesking/ruby_hl_lvar.vim が動かなくなっていた。
どうも Release MacVim-KaoriYa 20140501 · splhack/macvim から動かなくなったようだ。
Ruby 2.1 をインストールして RUBY_DLL を設定しろとあるが、ここらへんを参考にしても動かない。
そもそも、libruby.2.1.dylib が存在していない。
dylib を作るためには、--enable-shared オプションを付けてビルドするという情報を見つけ、Ruby2.1.2を入れなおした。
CONFIGURE_OPTS="--enable-shared --with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.2
しかしそれでも libruby.2.1.dylib は作成されない。
ひたすらぐぐってこの一連のやりとりを見つけたので、プレリリースでもこの際仕方ないとRelease MacVim-KaoriYa 20140514 · splhack/macvimを入れたらあっさり連携した。
ローカル変数にも色がついた。
次の本リリースまではこれでいこう。

2014/06/18

redmine_reminderz

pinzolo/redmine_reminderz という Redmine のプラグインを作った。
Redmineには締め切りの近いチケットを通知する redmine:send_reminders というRakeタスクがあるが、今のプロジェクトでは進捗率80%以上のチケットはレビュー待ちなので担当者にリマインダーとして送りたくないらしい。
多分 Redmine の運用方針を変えればカバーできる話だが、Redmineをそんなにガシガシと使いこなしているわけでもないし、プロジェクト的にそこまでの余裕もない。
というわけで、進捗率でフィルタできるオプションを追加したタスクをプラグインとして作成した。
タスク名を redmine:send_reminders から redmine:send_reminderz に変更するだけ(最後のsをz)
既存のオプションはそのまま使えて、進捗率を >, >=, <, <= でフィルタするオプションが指定できる。

開発30分、目視確認30分の突貫作業だったので、まだテストもないし、設計もよろしくない。
既存のタスクに独自オプションによる処理を差し込む方法が思いつかず丸々コピーしてしまった。
redmineから始まるタスク名もあまり良くないなとちょっと後悔している。そのうち別名でも用意する。
とまあ、だいぶ中途半端な出来だけど、せっかくなので公開しておく。
テスト、オプションの充実、締め切り通知以外のリマインダーの追加などできる事は結構あると思うので、ゆっくり育てます。

2014/06/13

Redmine のプラグインを RSpec3 でテスト出来ない

pinzolo/redmine_persist_wfmt を RSpec3 に対応しようとしてみたが実行すら出来なかった。
/Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/rspec-support-3.0.0/lib/rspec/support/version_checker.rb:28:in `raise_too_low_error': You are using capybara 2.1.0. RSpec requires version >= 2.2.0. 
(RSpec::Support::LibraryVersionTooLowError)
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/rspec-support-3.0.0/lib/rspec/support/version_checker.rb:18:in `check_version!'
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/rspec-rails-3.0.1/lib/rspec/rails/vendor/capybara.rb:13:in `'
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:251:in `require'
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:251:in `block in require'
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:236:in `load_dependency'
        from /Users/pinzolo/projects/redmine/persist_wfmt/redmine-2.5.1/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:251:in `require'
        .... and more
Redmine 本体の Gemfile で gem "capybara", "~> 2.1.0" なのだが、RSpec3 で Capybara を使用するには 2.2.0 以上を要求される。
このエラーは実行時でなく事前チェックで投げられているようで、 Capybara をプラグインのテストで使用していなくても出る。
さすがに本体のバージョンを無視するわけにはいかないので、当分は gem "rspec", "~> 2.14.0" で行こうと思う。
というか、やっぱりこういうのを避けるためには ActiveSupport::TestCase で書いたほうがいいんだろうな。

RSpec3ではもう-cfsオプションは許してくれない

2.1.2 とか Rails 4.1 での CI 設定を手持ちの gem に一気に済ませてビルドしたら一気にコケた。
tekido #20
formap #36

こんな感じでコケる。
/home/travis/.rvm/rubies/ruby-2.1.2/bin/ruby -I/home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib:/home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-support-3.0.0/lib -S /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/exe/rspec spec/formup/attr_def_spec.rb spec/formup/source_spec.rb spec/formup_boolean_cast_spec.rb spec/formup_included_spec.rb spec/formup_initialize_spec.rb spec/formup_load_spec.rb spec/formup_params_for_spec.rb spec/formup_source_called_spec.rb spec/formup_validation_spec.rb -cfs
/home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/formatters.rb:167:in `find_formatter': Formatter 's' unknown - maybe you meant 'documentation' or 'progress'?. (ArgumentError)
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/formatters.rb:126:in `add'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/configuration.rb:624:in `add_formatter'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/configuration_options.rb:106:in `block in load_formatters_into'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/configuration_options.rb:106:in `each'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/configuration_options.rb:106:in `load_formatters_into'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/configuration_options.rb:24:in `configure'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/runner.rb:96:in `setup'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/runner.rb:85:in `run'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/runner.rb:70:in `run'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/lib/rspec/core/runner.rb:38:in `invoke'
 from /home/travis/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.1/exe/rspec:4:in `
'
原因はここ。 要するに「s なんてフォーマット知らないよ」ということ。
bundle exec rspec --helpしても確かにそんなものはない。ていうか、2.14の頃からすでにない。
ググったらたくさん出てくるので、かつてはあったんだろう。
2.14のころは許容していたのか、厳密ではなかったのかしらないが3からは厳密になったということかな。
さあ、あなたの Rakefile や .rspec も見なおしてみましょう。

2014/06/12

zsh環境の正常化とpecoとzshが連携出来ないお話

ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts をやってみようと思い、ghq と gem-src は無事導入できた。 最近は golang 製の percol である lestrrat/peco というものがあるらしく、全く使っていない pip を使うよりいいなとやってみたが zsh の連携が出来ない。
function peco-src() {
    local selected_dir=$(ghq list --full-path | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-src
bindkey '^S' peco-src
こんなのを.zshrcに書いたが、Ctrl-S で起動しないし、直接 peco-src とやってディレクトリを選択するとエラーになる。
peco-src:zle:4: widgets can only be called when ZLE is active
peco-src:zle:6: widgets can only be called when ZLE is active
あれこれいじったり調べていると、どうも自分の zsh の環境が少しおかしいことに気づく。
% echo $module_path
/usr/lib/zsh/5.0.2/zsh
% zsh --version
zsh 5.0.5 (x86_64-apple-darwin13.0.0)
明らかにおかしい。どうやら、実行しているシェルは Mac に元から入っていた zsh のようだ。
おそらく、購入時に環境設定した時には chsh -s /bin/zsh したんだろう。
さっそく、homebrew の zsh に切り替える。
% sudo sh -c "echo /usr/local/bin/zsh" >> /etc/shells
% chsh -s /usr/local/bin/zsh
しかし、下記のエラーが出た。
/Users/pinzolo/.zshenv:1: command not found: rbenv
/Users/pinzolo/.zshenv:2: command not found: pyenv
compinit:183: module `zsh/parameter' has no such feature: `p:dis_patchars': autoload cancelled
compinit:183: module `zsh/parameter' has no such feature: `p:patchars': autoload cancelled
rbenv と pyenv のエラーは .zshenv の先頭に export PATH="/usr/local/bin:$PATH" を追加したら消えた。
compinit のエラーは zsh を再インストールしたら消えた。
% brew uninstall zsh
% brew install zsh --enable-etcdir
しかし、それでも peco-src は動かない。
/usr/local/Cellar/zsh/5.0.5/libzle.so はあるし、.zshrc 内では zle は動いていると思われる。
実行時にエラーが出るんだが、どうしてなんだろうか?
調べても同様の状況の人が出てこない。どうしたものか

2014/06/10

rails-render_hooks という gem を作った

Redmine のプラグインなんかを作っていると、アクションの処理が終了してレンダリングされる前にちょっと手を入れたくなる。
実際そういう需要はそれなりにあるようで、'rails before_render' とかで検索するとチョロチョロ出てくる。
しかし、Rails3.2〜Rails4.1で動くぐらいにメンテされている gem がない。
  • shell/rails3_before_render
    Rails4 で動かないし、Rails4で動くように修正されたプルリクエストも放置
  • nilesh/before_render
    上記から fork して Rails4 で動くけど、逆に Rails3.2 で動かない
  • codepodu/rails3_before_render
    上記のプルリクエスト元なのでどっちでも動くけどRails4.1だとテスト落ちる。そもそも Travisこけてるけど放置。プルリクエスト用だから gem になってない
というわけで、自分で作った ついでに、before だけでなく、after と around も足しておいた。使うかどうかは知らないけど。

2014/06/06

git-2.0.0をサーバにインストール

% cd /opt/src
% wget https://www.kernel.org/pub/software/scm/git/git-2.0.0.tar.gz
% tar xf git-2.0.0.tar.gz
% cd git-2.0.0
% ./configure --prefix=/opt/git/git-2.0.0 --with-openssl --with-curl
% make
% make install
% /opt/git/git-2.0.0/bin/git --version
git version 2.0.0
% ln -sfn /opt/git/git-2.0.0/bin/* /usr/bin % git --version
git version 2.0.0
ln -sfnでシンボリックリンクが上書きできることを初めて知ったのでメモ。