2013/12/29

今開いているファイルの *** をレジスタに

.vimrc にこんなのを書いておくと結構便利だった。
クリップボードと連携しておけば、さらに捗る。

2013/12/08

Redmineのプラグインで既存の文言を上書きする

この情報は Redmine 2.5 で不要になりました。→ tail -f pinzo.log: Redmine 2.5.0 からプラグインでの文言上書きが復活しています

Redmine のプラグインで本体の文言を上書きすることが出来ません。
昔はできたようなのですが、バージョンが違うのか I18n の仕様が変わったのか現在は出来ません。

ja:
  project_module_documents: ドキュメント
  project_module_calendar: 日程表

プラグインの ja.yml にこんな記述をしても画面はかわりません。

通常、プラグインをロードすると、I18n.load_path はこんな状態になります。

$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.15/lib/active_support/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activemodel-3.2.15/lib/active_model/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.15/lib/active_record/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_view/locale/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/ja.yml
$REDMINE_HOME/config/locales/ar.yml
$REDMINE_HOME/config/locales/az.yml
$REDMINE_HOME/config/locales/bg.yml
--- 延々と Redmine 本体の言語ファイルが列挙
$REDMINE_HOME/config/locales/vi.yml
$REDMINE_HOME/config/locales/zh-TW.yml
$REDMINE_HOME/config/locales/zh.yml

rails/railties/lib/rails/engine.rb at 3-2-stable · rails/rails にあるように、I18n.load_path の後ろのほうが優先度が高いので、本体の言語ファイルのほうが優先されてしまいプラグイン側で上書きすることができません。 プラグインの登録は config/initializers/30-redmine.rb で行われていて、その際にプラグインの辞書ファイルが I18n.load_path に登録されるのですが、この時点ではアプリケーション本来の辞書ファイルが登録されていないからでしょう。

じゃあどうすればいいのかというと、どこかで I18n.load_path を調整して、プラグインの辞書ファイルを後ろの方にもっていくのがいいのかなと。
確実に行うなら、初期化完了時がよさげですね。
Rails::Engine には after_initialize という目的そのままの機能があるのでこれが使えそうです。

こんなコードを lib あたりに突っ込んでおいて、init.rbrequire すればOK。
I18n.load_path はこんな感じになります。

$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.15/lib/active_support/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activemodel-3.2.15/lib/active_model/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.15/lib/active_record/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_view/locale/en.yml
$REDMINE_HOME/config/locales/ar.yml
$REDMINE_HOME/config/locales/az.yml
$REDMINE_HOME/config/locales/bg.yml
--- 延々と Redmine 本体の言語ファイルが列挙
$REDMINE_HOME/config/locales/vi.yml
$REDMINE_HOME/config/locales/zh-TW.yml
$REDMINE_HOME/config/locales/zh.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/ja.yml

これで、本体の辞書ファイルをプラグインの辞書ファイルで上書きすることができました。

2013/12/07

Railsのログに出力されるパラメータとSQLを整形するgemを作った

最初に

この記事は Ruby on Rails Advent Calendar 2013 - Qiita [キータ] の7日目の記事です。
前日は a_suenami さんの Railsでサービスとフォームを導入してみる話 - assertInstanceOf('Engineer', $a_suenami) です。

本題

こういう gem を作りました。

pinzolo/rails-flog - Github
rails-flog - RubyGems.org

Gemfile に下記を追加して bundle install するだけで、ログに出力されるパラメータとSQLが整形して出力されるようになります。

gem 'rails-flog', :require => 'flog'

Redmine でのスクリーンショットはこんな感じ。

使用前

使用後

Railsアプリケーションに tmp/no-flog.txt を配置すれば一時的に整形をやめることもできます。

残念なところ

  • 実装が結構強引。二重の特異メソッドとかどうなんでしょうね。完全に元の実装依存だし。
  • パラメータはスペース整形だけど、SQLはタブ整形。こいつ のせい。

作った経緯

  1. 先日、西脇.rb & 東灘.rb 合同もくもく会 7th - 西脇.rb & 東灘.rb に参加した時に、@jnchito さんが、色々と awesome_print で出力するWebサービスを作成されてて、その際にログに出力される複雑なパラメータを手作業で整形するのがタルいみたいな事をおっしゃってまして、「あるある」と思っていた。
  2. んで、複雑なSQLもタルいよなー、整形してログに出力させるぐらいならできんじゃね?
  3. anbt-sql-formatter てのがあるじゃない。イケそう。
  4. 誰か作ってんじゃない?と調べてみると Railsのログに出力されるパラメータやSQLを整形する - ( ꒪⌓꒪) ゆるよろ日記 というそのものなものが見つかる。しかも自分でブクマ済み。
  5. もう少し調べてみるとどうやら同等の機能をもつ gem は存在していないみたい。
  6. 作ってみるか。

思うところ

我々エンジニアは誰しも素晴らしいプロダクトやサービスを作りたいと思っていると思います。
そして多くの人が時間、技術力、アイデア、ビジョン等々の不足であきらめているのでしょう。
でもエンジニアの本質は「素晴らしい物を生み出す」よりも、「一歩進める」ことだと思っています。
ひとが考えもしない方向へ一歩進められたり、一歩がとっても大きい人が素晴らしいプロダクトやサービスを生み出せるのでしょう。
出来なかったことをできるようにしたり、自動化したり、簡略化したり、みんな一歩進めた結果です。
rails-flogも、アイデアも実装手段も他の巨人に乗っかったものですが、gemにするという一歩だけ進めることが出来ました。
一歩進めるだけなら誰にでもできるでしょう、さああなたも身近なものを一歩進めてみてください。

Next

明日は znz さんです。

2013/11/28

Coverallsで特定のファイルのみ集計対象にする

なにか作って Github に置く場合、基本的に Travis と Coveralls を利用している。
Coveralls を利用するのは簡単で、基本的には下記の手順で問題ない。

  1. coveralls の gem をインストールする
  2. .coveralls.yml を作成
  3. spec_helper などの最初に require "coveralls" して Coveralls.wear! する
  4. push する

とはいえ、これだとテストでロードされた全てのファイルが対象になってしまう。
全てのファイルが対象になるとスペックファイルの fail とか、lib に突っ込んだ外部ライブラリとかも対象になってしまい、永久に 100% にならない。

それは困るので調べてみたら、ちゃんと公式に書いてあった
なるほど、フォーマッタだけ Coveralls のを使用すればいいのね。

こんな感じ。

ちょっと、個人的に直感的じゃないなと思うのは、add_filter の引数がパスに含まれているファイルやブロックにて true を返すファイルを除外するというところ。
フィルタなんだから、マッチするものだけを対象にするかと思ったら逆なんだな。

2013/11/23

Redmine のプラグインを Travis で CI してみた

Redmine のプラグインの場合、プラグイン本体のみ Github に登録しているので、そのままでは Travis で CI することができない。
諦めていたんだけど、.travis.yml のオプションとにらめっこしたらなんとなく出来そうな気がしたので試してみた。
10数回の試行を経て、なんとか出来たのでスクリプトを紹介します。

  • .travis.yml
    before_install があるので、after_install があるかと思ったらなかった。

  • before_install.sh
    gem インストール前に実行させるスクリプト。
    Travis では bundle install 前に直下の GemfileBUNDLE_GEMFILE 環境変数に登録されてしまう。
    しかし、指定したいのはプラグインの Gemfile ではなく、Redmine のものなのである。
    なので、mv しまくりでなんとかディレクトリ構成を整えた。苦労した。
    Redmine のダウンロード URL がバージョンだけに依存してくれないのが少し残念。

  • exec_test.sh
    テスト実行用スクリプト。
    前述のとおり after_install がなかったので、bundle install 後の処理(Redmineの初期化など)とテストの実行を同時にすることにした。
    こちらはそんなに苦労しなかった。

これで、プラグインを複数バージョンの Ruby でテストすることができるようになった。
でも、複数バージョンの Redmine でテストすることは当然できない。
複数バージョンの Redmine を対象にテストするなら Jenkins 使うのがいいんだろうな。

2013/11/06

OS X Mavericks にすると gcc-4.2 がなくなるらしい

bundle installしたらエラーになった。

pinzolo@ileach [master] % bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/......... Fetching gem metadata>from https://rubygems.org/.. Resolving dependencies... Using rake (10.1.0) Using i18n (0.6.5) Using minitest (4.7.5) Using multi_json (1.8.2) Installing atomic (1.1.14) Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby extconf.rb *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby --with-atomic_reference-dir --without-atomic_reference-dir --with-atomic_reference-include --without-atomic_reference-include=${atomic_reference-dir}/include --with-atomic_reference-lib --without-atomic_reference-lib=${atomic_reference-dir}/ /Users/pinzolo/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/mkmf.rb:431:in `try_do': The compiler failed to generate an executable file. (RuntimeError) You have to install development tools first. from /Users/pinzolo/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/mkmf.rb:516:in `try_link0' from /Users/pinzolo/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/mkmf.rb:814:in `try_run' from extconf.rb:26:in `
' Gem files will remain installed in /Users/pinzolo/projects/detox/vendor/bundle/ruby/2.0.0/gems/atomic-1.1.14 for inspection. Results logged to /Users/pinzolo/projects/detox/vendor/bundle/ruby/2.0.0/gems/atomic-1.1.14/ext/gem_make.out An error occurred while installing atomic (1.1.14), and Bundler cannot continue. Make sure that `gem install atomic -v '1.1.14'` succeeds before bundling.

mkmf.log見ろって言われたので見てみる。

pinzolo@ileach [master] % cat vendor/bundle/ruby/2.0.0/gems/atomic-1.1.14/ext/mkmf.log
"gcc-4.2 -o conftest -I/Users/pinzolo/.rbenv/versions/2.0.0-p195/include/ruby-2.0.0/x86_64-darwin12.4.0 -I/Users/pinzolo/.rbenv/versions/2.0.0-p195/include/ruby-2.0.0/ruby/backward -I/Users/pinzolo/.rbenv/versions/2.0.0-p195/include/ruby-2.0.0 -I. -I'/Users/pinzolo/.rbenv/versions/2.0.0-p195/include' -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -O3 -Wno-error=shorten-64-to-32 -fno-common -pipe conftest.c -L. -L/Users/pinzolo/.rbenv/versions/2.0.0-p195/lib -L. -L'/Users/pinzolo/.rbenv/versions/2.0.0-p195/lib' -lruby.2.0.0 -lpthread -ldl -lobjc " sh: gcc-4.2: command not found checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main(int argc, char **argv) 4: { 5: return 0; 6: } /* end */
gcc-4.2がないらしい。

どうやら Mavericks にしたら、gcc-4.2gccになるらしい。

sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2したら、解決した。

2013/09/08

RedmineのプラグインをRSpecでテストする

Redmineは基本的にはxUnitなコードでテストが書かれています。
今のところ例に習いxUnit形式でテスト書いていたんだけど、RSpecで書きたいなという欲求は当然あるわけです。
なので今回RSpecを導入してみた。

まずは、$REDMINE/plugins/<plugin_name>/Gemfile を作成して、bundle install

# Gemfile
group :development, :test do
  gem "rspec-rails", ">= 2.8.1"
end

$REDMINE/plugins/<plugin_name>/spec/spec_helper.rbを作成し、設定を記述。

require File.expand_path(File.dirname(__FILE__) + '/../../../spec/spec_helper')
RSpec.configure do |config|
  config.mock_with :mocha
  config.fixture_path = "#{::Rails.root}/test/fixtures"
end

各種specファイルの冒頭で spec_helper をrequireする。

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
# require 'spec_helper' ではダメだった。

基本的にはこれで設定はいいはずだけど、なぜかspecタスクで実行できない。
実行できないというよりspecファイルが見つけられないらしい。
rspec コマンドを指定しても不可能。
ベースディレクトリを指定してやれば実行できた。

$ bundle exec rake spec                             # ダメ
$ bundle exec rspec                                 # これもダメ
$ bundle exec rake spec plugins/<plugin_name>/spec  # これでもダメ
$ bundle exec rspec plugins/<plugin_name>/spec      # これはOK

2013/08/20

[#nshgrb]西脇.rb & 東灘.rb もくもく会 6th と Kobe Rubyist Meetup に参加してきました

8/17に西脇.rb & 東灘.rb もくもく会 6th と Kobe Rubyist Meetup に続けて参加してきました。
いつも Kyoto.rb に参加してくださってる @spring_aki さんから、宣伝があったのと、SonicGarden の人が来るというのと、コードレビューつきもくもく会に興味があったので、新快速で一時間ほど揺られて行ってきました。

作ったもの

redmine_yare という簡単な Redmine のプラグインを作りました。
最近プライベートで Redmine のプラグインを作っているので、勉強がてらということととりあえず今回はもくもく会の中で完結するものを作りたかったので、シンプルなものにした。
画面遷移する度に今日が期限のチケットをダイアログ表示する非常に迷惑なプラグインです。

苦労したところ

フックのロジックとビューを分離するところが苦労した。
コレについてのまとめは後日に別エントリであげます。

もくもく会の感想

意外と3時間というのは短くて思ったより実装が進まなかった。調査に時間がかかったというのもあるけれど。結構時間を無駄に使っていたと思う。その都度しっかり意思決定していればもっと効率的な進め方が出来たと思う。
コードレビューでは、自分のコードはコード量自体が少なくてあまり突っ込まれなかった。(スペルミスしたけど)
気になったのは、レビューイと限られた人がメインでしゃべっている感じだったので、もっと全員でコードレビューしている感じがでるといいなと思う。(一人15分だし、スキルや経験の差があるのでしかたのないこととは思うが)

Meetup

懇親会はやっているけど、規模を拡大して Meetup は初の試みだったそうだ。
やっぱり酒が入って話しやすくなってくると濃い話が自然発生するのが楽しい。
正規表現の話や、Railsのコントリビュータの体験談などの話を酒を聞けるのは貴重な機会だった。

今後

特性上、大人数で行えないタイプの勉強会なので毎回参加というのは難しいとは思うが、また参加したいなと思う。
今回の ProMotion のお話のように、他者に新しい体験を提供できるようなネタがあればいいんだけど、しばらくは難しいかもな。Redmine のプラグインを頑張らねば。

西脇.rb と東灘.rb の皆様お疲れ様でした。

2013/08/01

Redmine plugin にて自動ロード対象のディレクトリを追加するには

どうやら Redmine はプラグインの lib は自動的にロードパスに登録するが、app 以下は controllers, models, helpers のみを autoload の対象にするようだ。
lib/redmine/plugin.rb にこんな記述があった。

例えば、フォームクラスを作って app/forms に配置したい場合は、init.rb に処理を追加してやる必要がある。 一つしか追加しないなら simple の方でいいだろうし、複数追加するなら plugin.rb をパクって multiple で書くのがいいんじゃないかな。

2013/07/28

Redmine plugin 開発時の fixture

Redmine のプラグインのユニットテストのために、fixture を追加した。 $REDMINE/plugins/my_plugin/test/fixtures/my_models.ymlという形でテストデータを追加し、bundle exec rake redmine:plugins:test RAILS_ENV=testを実行したらエラーになった。

Errno::ENOENT: No such file or directory - /Users/pinzolo/projects/my_plugin/redmine-2.3.1/test/fixtures/my_models.yml

つまり、プラグインのtest/fixturesディレクトリを見ていないということみたいだ。

プラグインの test/fixtures を見るように設定するなら、$REDMINE/plugins/my_plugin/test/test_helper.rb に下記を追加すればいいんだけど、こうすると $REDMINE/test/fixtures を見てくれなくなる。

fixture_path が配列でもよしなにやってくれるようにパッチを当てたいところだが、fixture_pathが結構ダイレクトに使われているので大変そうなのと、プラグイン側がやることでもなかろうということで、仕方なく $REDMINE/test/fixtures にコピーする。 fixture を作ったり更新したりする度にコピーするのはめんどいな。

2013/07/26

RAILS_ENV=test な rails console を実行するには

Rails アプリでテスト環境での irb を実行したくて bundle exec rails console RAILS_ENV=test とするとエラーになった。
どうやら bundle exec rails console test とする必要があるらしい。
ちなみに、RAILS_ENV=test な rails console では、SQL のログが出力されて便利ですよ。
pinzolo@ileach % bundle exec rails console test
*** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. Loading test environment (Rails 3.2.13)
irb(main):001:0> Project.all.first
Project Load (0.2ms) SELECT "projects".* FROM "projects" => #<Project id: 1, name: "eCookbook", description: "Recipes management application", homepage: "http://ecookbook.somenet.foo/", is_public: true, parent_id: nil, created_on: "2006-07-19 17:13:59", updated_on: "2006-07-19 20:53:01", identifier: "ecookbook", status: 1, lft: 1, rgt: 10, inherit_members: false>

2013/07/22

特定のモジュールがextendされているかを調べる

include したモジュールは included_modules 経由で調べられるが、extend したモジュールを取得する extend_modules のような API はなかった。
調べてみたところ、一手間かけたら取得することができるみたいだ。

2013/07/20

done homework of Kyoto.rb

先日の Kyoto.rb でライブコーディングの題材となった TDDBC の課題(TDD Boot Camp(TDDBC) - TDDBC大阪2.0/課題)をやってみた。
kyotorb/2013-07-18_TDDBC at master · pinzolo/kyotorb

ステップ5は出力だけの話なのでステップ4まででいーや。(投げやり)
英語がかなり微妙、そして RSpec の describe や context の扱いも慣れていないのでブレまくり。

2013/07/17

椅子代わりにバランスボールを導入してみた

引っ越してようやく開発用机も届いて、残すは椅子だけとなった我が家の開発環境。
近場のオフィス用品中古店を見て回り、45kでアーロンチェアが売っていたり、16kのオカムラのFeegoもいいなと思っていた。
しかしまあ思いつきで、バランスボールによる体幹トレーニングができるなら、それでいいかなと。安いし。
ヨドバシで1kちょいなんで、失敗しても諦めつくし。高い椅子はそれから買えばいいし。
というわけで、バランスボールを椅子代わりに我が家に導入しました。
子供が出来たら安全面を考える必要があるかもしれないけど、しばらく試してみます。
願わくば、体にいい傾向が出ますように。

java -jar にて実行可能な jar ファイルを作成するための pom.xml 設定

executable jar が作成したかったので調べた。
classpathPrefix でクラスパスを通すディレクトリを指定できるのはかなり便利だと思う。

2013/07/08

github のリポジトリを remote add して push したらエラーが出た

git push したらこんなエラーが出た。

% git push origin master
To git@github.com:pinzolo/repo.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@github.com:pinzolo/repo.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

いつも下記の手順で github と連携していたから、特に困ったことはなかった。

  1. github にリポジトリを作成する
  2. ローカルに clone する
  3. 開発する

しかし今回は

  1. ローカルで git init する
  2. github リポジトリを作成
  3. ローカルに対して git add origin git@github.com:pinzolo/repo.git
  4. 冒頭のエラー

というわけだ。

github でリポジトリを作成した時に README.md を作成したから、そっちの情報がなかったわけね。
というわけで、一旦 git pull してから git push したらエラーは出なくなった。なるほど

2013/07/04

startup_redmine_plugin_development.sh

Redmine のプラグインを開発するときに最初に行う作業を自動化するスクリプトを書いた。
自動で行なってくれる作業は
  1. 専用ディレクトリの作成
  2. 最新のRedmineを取得
  3. Redmineをローカルにデプロイ
    1. database.ymlを作成
    2. gemのインストール
    3. トークンの作成
    4. マイグレーションの実行
    5. デフォルトデータのロード(デフォルトは日本語)
  4. プラグインの雛形を生成
  5. gitにて初回コミット
惜しむらくは、バージョンとダウンロードURLは都度メンテナンスしていく必要があることかな。

2013/06/22

Redmine プラグインのテストが実行できるまで

Redmineのプラグインのテストが実行できるまでのメモ。意外と苦労した。

環境はこちら。
  • Ruby 2.0.0-p195(use rbenv)
  • Redmine 2.3.1
  • Mac OS X 10.8.4

まずは、公式を参考に実行。

% bundle exec rake test:engines:all
rake aborted! Don't know how to build task 'test:engines:all' ...

タスクが存在していないみたいなので、テストに関連しそうなタスクの一覧を確認。

% bundle exec rake -T | grep test
rake ci # Run the Continous Integration tests for Redmine rake extract_fixtures # Create YAML test fixtures from data in an existing database. rake redmine:email:test[login] # Send a test email to the user with the provided login name rake redmine:plugins:test # Runs the plugins tests. rake redmine:plugins:test:functionals # Run tests for {:functionals=>"db:test:prepare"} rake redmine:plugins:test:integration # Run tests for {:integration=>"db:test:prepare"} rake redmine:plugins:test:units # Run tests for {:units=>"db:test:prepare"} rake test # Runs test:units, test:functionals, test:integration together (also available: test:benchmark, test:profile, test:plugins) rake test:coverage # Measures test coverage rake test:rdm_routing # Run tests for rdm_routing / Run the routing tests rake test:recent # Run tests for {:recent=>"test:prepare"} / Test recent changes rake test:scm # Run unit and functional scm tests rake test:scm:functionals # Run tests for {:functionals=>"db:test:prepare"} / Run the scm functional tests rake test:scm:setup:all # Creates all test repositories rake test:scm:setup:bazaar # Creates a test bazaar repository rake test:scm:setup:create_dir # Creates directory for test repositories rake test:scm:setup:cvs # Creates a test cvs repository rake test:scm:setup:darcs # Creates a test darcs repository rake test:scm:setup:filesystem # Creates a test filesystem repository rake test:scm:setup:git # Creates a test git repository rake test:scm:setup:mercurial # Creates a test mercurial repository rake test:scm:setup:subversion # Creates a test subversion repository rake test:scm:units # Run tests for {:units=>"db:test:prepare"} / Run the scm unit tests rake test:scm:update # Updates installed test repositories rake test:single # Run tests for {:single=>"test:prepare"} rake test:ui # Run tests for {:ui=>"db:test:prepare"} / Run the UI tests with Capybara (PhantomJS listening on port 4444 is required) rake test:uncommitted # Run tests for {:uncommitted=>"test:prepare"} / Test changes since last checkin (only Subversion and Git)

どうやら、rake redmine:plugins:test{functionals,integration,units}あたりでテストが出来そう。

% bundle exec rake redmine:plugins:test
rake aborted! undefined method `[]' for nil:NilClass … Tasks: TOP => db:test:load => db:test:purge

RAILS_ENV=test を忘れていた。

% bundle exec rake redmine:plugins:test RAILS_ENV=test
*** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. rake aborted! database configuration does not specify adapter … Tasks: TOP => redmine:plugins:test:units => db:test:prepare => db:abort_if_pending_migrations => environment

テスト用のデータベースの設定がしてない。 config/database.yml を編集して・・・

# config/databse.yml
development:
  adapter: sqlite3
  database: db/redmine.db

# ここから追加
test:
  adapter: sqlite3
  database: db/redmine_test.db

再度実行。

% bundle exec rake redmine:plugins:test RAILS_ENV=test
*** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. You have 221 pending migrations: 1 Setup 2 IssueMove 3 IssueAddNote 4 ExportPdf … Run `rake db:migrate` to update your database then try again.

マイグレーションができていないのね。

% bundle exec rake db:migrate RAILS_ENV=test
== Setup: migrating ========================================================== -- create_table("attachments", {:force=>true}) -> 0.0039s -- create_table("auth_sources", {:force=>true}) -> 0.0011s -- create_table("custom_fields", {:force=>true}) -> 0.0008s -- create_table("custom_fields_projects", {:id=>false, :force=>true}) -> 0.0004s -- create_table("custom_fields_trackers", {:id=>false, :force=>true}) -> 0.0413s -- create_table("custom_values", {:force=>true}) -> 0.0011s -- create_table("documents", {:force=>true}) -> 0.0008s -- add_index("documents", ["project_id"], {:name=>"documents_project_id"}) -> 0.0003s -- create_table("enumerations", {:force=>true}) -> 0.0005s -- create_table("issue_categories", {:force=>true}) -> 0.0005s -- add_index("issue_categories", ["project_id"], {:name=>"issue_categories_project_id"}) -> 0.0002s -- create_table("issue_histories", {:force=>true}) -> 0.0007s -- add_index("issue_histories", ["issue_id"], {:name=>"issue_histories_issue_id"}) -> 0.0002s -- create_table("issue_statuses", {:force=>true}) -> 0.0006s -- create_table("issues", {:force=>true}) -> 0.0011s -- add_index("issues", ["project_id"], {:name=>"issues_project_id"}) -> 0.0002s -- create_table("members", {:force=>true}) -> 0.0006s -- create_table("news", {:force=>true}) -> 0.0007s -- add_index("news", ["project_id"], {:name=>"news_project_id"}) -> 0.0002s -- create_table("permissions", {:force=>true}) -> 0.0007s -- create_table("permissions_roles", {:id=>false, :force=>true}) -> 0.0004s -- add_index("permissions_roles", ["role_id"], {:name=>"permissions_roles_role_id"}) -> 0.0002s -- create_table("projects", {:force=>true}) -> 0.0008s -- create_table("roles", {:force=>true}) -> 0.0004s -- create_table("tokens", {:force=>true}) -> 0.0006s -- create_table("trackers", {:force=>true}) -> 0.0005s -- create_table("users", {:force=>true}) -> 0.0009s -- create_table("versions", {:force=>true}) -> 0.0007s -- add_index("versions", ["project_id"], {:name=>"versions_project_id"}) -> 0.0002s -- create_table("workflows", {:force=>true}) -> 0.0006s == Setup: migrated (0.1067s) ================================================= … == RemoveIssuesDefaultFkValues: migrating ==================================== -- change_column_default(:issues, :tracker_id, nil) -> 0.0257s -- change_column_default(:issues, :project_id, nil) -> 0.0737s -- change_column_default(:issues, :status_id, nil) -> 0.0252s -- change_column_default(:issues, :assigned_to_id, nil) -> 0.0236s -- change_column_default(:issues, :priority_id, nil) -> 0.0245s -- change_column_default(:issues, :author_id, nil) -> 0.0251s == RemoveIssuesDefaultFkValues: migrated (0.1981s) =========================== % bundle exec rake redmine:load_default_data RAILS_ENV=test Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja ==================================== Default configuration data loaded.

もう一度実行。

% bundle exec rake redmine:plugins:test RAILS_ENV=test
*** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. /Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby -I"lib:test" -I"/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib" "/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "plugins/*/test/unit/**/*_test.rb" *** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. /Users/pinzolo/projects/sample_plugin/redmine-2.3.1/lib/SVG/Graph/Graph.rb:3: warning: class variable access from toplevel Run options: # Running tests: Finished tests in 0.067877s, 132.5928 tests/s, 132.5928 assertions/s. 9 tests, 9 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.4.0] /Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby -I"lib:test" -I"/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib" "/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "plugins/*/test/functional/**/*_test.rb" *** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. /Users/pinzolo/projects/sample_plugin/redmine-2.3.1/lib/SVG/Graph/Graph.rb:3: warning: class variable access from toplevel Run options: # Running tests: Finished tests in 0.062297s, 16.0521 tests/s, 16.0521 assertions/s. 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.4.0] /Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby -I"lib:test" -I"/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib" "/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "plugins/*/test/integration/**/*_test.rb"

成功したみたいなので、失敗させてみる。

# sample_model_test.rb
require File.expand_path('../../test_helper', __FILE__)

class SampleModelTest < ActiveSupport::TestCase

  # Replace this with your real tests.
  def test_truth
    #assert true
    assert false
  end
end
% bundle exec rake redmine:plugins:test:units RAILS_ENV=test
berk redmine:plugins:test:units RAILS_ENV=test (in /Users/pinzolo/projects/sample_plugin/redmine-2.3.1) *** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. /Users/pinzolo/.rbenv/versions/2.0.0-p195/bin/ruby -I"lib:test" -I"/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib" "/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "plugins/*/test/unit/**/*_test.rb" *** Mocha deprecation warning: Change `require 'mocha'` to `require 'mocha/setup'`. /Users/pinzolo/projects/sample_plugin/redmine-2.3.1/lib/SVG/Graph/Graph.rb:3: warning: class variable access from toplevel Run options: # Running tests: [1/9] SampleModelTest#test_truth = 0.00 s 1) Failure: test_truth(SampleModelTest) [/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/plugins/sample_plugin/test/unit/sample_model_test.rb:8]: Failed assertion, no message given. Finished tests in 0.069086s, 130.2724 tests/s, 130.2724 assertions/s. 9 tests, 9 assertions, 1 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.4.0] rake aborted! Command failed with status (1): [ruby -I"lib:test" -I"/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib" "/Users/pinzolo/projects/sample_plugin/redmine-2.3.1/vendor/bundle/ruby/2.0.0/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "plugins/*/test/unit/**/*_test.rb" ] … Tasks: TOP => redmine:plugins:test:units

予定通り失敗した。
あとはテストを書いて実行していけばよさそうだ

Ruby2.0.0をインストール

Ruby 2.0 がリリースされてしばらくしたのでそろそろ入れることにした。

% rbenv install 2.0.0-p195
Downloading ruby-2.0.0-p195.tar.gz... -> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p195.tar.gz Installing ruby-2.0.0-p195... BUILD FAILED Inspect or clean up the working tree at /var/folders/1j/hw72brh57jv94vdl9567fr140000gn/T/ruby-build.20130621233411.34289 Results logged to /var/folders/1j/hw72brh57jv94vdl9567fr140000gn/T/ruby-build.20130621233411.34289.log Last 10 log lines: make[2]: *** [readline.o] Error 1 make[1]: *** [ext/readline/all] Error 2 make[1]: *** Waiting for unfinished jobs.... compiling ../.././ext/psych/yaml/reader.c compiling ../.././ext/psych/yaml/scanner.c compiling ../.././ext/psych/yaml/writer.c installing default psych libraries linking shared-object psych.bundle ld: warning: directory not found for option '-L/Users/pinzolo/.rbenv/versions/2.0.0-p195/lib' make: *** [build-ext] Error 2

なんか失敗した。
こちらを参考に再度挑戦。
readline は入っていたので openssl を入れて、`RUBY_CONFIGURE_OPTS`を指定してインストール。

% brew update
% brew install openssl
% brew link openssl --force
% brew install curl-ca-bundle
% brew list curl-ca-bundle
/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt
% cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem % RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline` --enable-shared" rbenv install 2.0.0-p195
Downloading ruby-2.0.0-p195.tar.gz... -> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p195.tar.gz Installing ruby-2.0.0-p195... Installed ruby-2.0.0-p195 to /Users/pinzolo/.rbenv/versions/2.0.0-p195

いけたみたいなので確認。

% ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.4.0]

bundler は入れておかないと。

% gem install bundler
Fetching: bundler-1.3.5.gem (100%) Successfully installed bundler-1.3.5 1 gem installed

バッチリ!お疲れ様でした。

2013/06/20

Redmine から Google Apps のメールを送信する

一人しか使ってないプライベートの Redmine ですが、メール設定しておくのを忘れていたので、メール設定を行った。
GMail の設定は過去に行ったが Google Apps の設定は初めてなのでメモ。
ちなみに環境は Redmine 2.3.1 on Ruby 1.9.3。

とはいっても、Google Apps のメールとはいってもほぼ GMail と同じ。
$REDMINE_HOME/config/configuration.ymlに下記の設定をするだけ。
変更したのは domain を Google Apps で使用しているドメインに設定した。それだけ。

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "mkt-sys.jp"
      authentication: :login
      user_name: "hogefuga@mkt-sys.jp"
      password: "foobarbaz"

2013/06/08

さくらVPSのRedmineを2.0.0から2.3.1にアップデート

ちょっとこれから Redmine のプラグインでも作りたいなと思い、VPSのRedmineをまず最新にした。
やったことはtail -f pinzo.log: Redmine を 1.4.1 から 2.0.0 にアップデートしたの焼き直し。
あと、「Plugin assetsディレクトリに書き込み可能」にビックリマークが出ていたので、解消しておいた。
$REDMINE_HOME/public/plugin_assetsディレクトリを作成して、www-dataにchownしただけ。

2013/06/06

Kyoto.rbに行ってきた

登録はしたものの、引越しとかなんとかで一度も行っていなかったKyoto.rbに初参加してきた。
とはいえ、途中から参加のため自己紹介して軽く発言した程度。
ていうかスーツが俺だけ!?っていうのが驚いた。

引越しとか関西での仕事探しとかですっかりプライベートでの開発熱が下がっていたけど、久しぶりに技術者の集いに参加できたおかげで少しテンションが上がった。
やっぱりモノ作らんといかんよな。

次回の Kyoto.rb は6/20。また参加します。

2013/01/24

macにtreeコマンドをインストール

ディレクトリ階層を確認するために便利な tree コマンドを Mac で使用したい。
というわけで Homebrew でさくっとインストール。

% brew install tree
==> Downloading http://mama.indstate.edu/users/ice/tree/src/tree-1.6.0.tgz
######################################################################## 100.0%
==> make prefix=/usr/local/Cellar/tree/1.6.0 MANDIR=/usr/local/Cellar/tree/1.6.0/share/man/man1 CC=cc CFLAGS=-fomit-frame-pointer LDFLAGS= OBJS=tree.o unix.o html.o xml.o hash.o color.o strverscmp.o install
/usr/local/Cellar/tree/1.6.0: 7 files, 120K, built in 4 seconds

簡単です。

使用も簡単です。

% tree
.
├── dir1
│   └── file1-1.txt
├── dir2
│   ├── dir3
│   │   └── file3-1.txt
│   ├── file2-1.txt
│   └── file2-2.txt
└── file1.txt

3 directories, 5 files

ディレクトリ指定。

% tree dir2
dir2
├── dir3
│   └── file3-1.txt
├── file2-1.txt
└── file2-2.txt

1 directory, 3 files

ディレクトリ表示のみ。

% tree -d
.
├── dir1
└── dir2
     └── dir3

3 directories

全ファイル表示。

% tree -a
.
├── .dotdir
│   └── .dotfile2
├── .dotfile
├── dir1
│   └── file1-1.txt
├── dir2
│   ├── dir3
│   │   └── file3-1.txt
│   ├── file2-1.txt
│   └── file2-2.txt
└── file1.txt

4 directories, 7 files