cocoa*life
Steak で RESTful API の受け入れテストを書く
- 2010-12-10 (Fri)
- Ruby on Rails
Steak は Ruby 製の受け入れテストのためのフレームワークです。
cavalle/steak – GitHub
Github にある説明を読んでいただくとわかると思いますが Steak ではテストは RSpec のように書くことができます。
同様のツールに Cucumber もありますが、Cucumber は英語や日本語で書かなければならないので、自分の中でどうもしっくりしませんでした。
そのため、自分にとっては Steak のようにかけた方がずっと書きやすいです。
ということで、これからは Steak を使って受け入れテストを書いていこうと思っています。
そんな Steak ですが、RESTful API のテストもしたいです。
どうも Steak の裏で動いている Capybara というテストフレームワークは、 visit ‘/’ のように GET することはできるのですが、 POST PUT DELETE というような RESTful API をテストする上ではそれだけでは足りません。
以下のような方法で、POST 等のメソッドを呼び出すことが可能なようです。
$RAILS_ROOT/spec/acceptance/support/helper.rb
module HelperMethods
def setup_driver
@driver = Capybara.current_session.driver
end
def post(path, params = {})
@driver.process :post, path, params
end
def put(path, params = {})
@driver.process :put, path, params
end
def delete(path, params = {})
@driver.process :delete, path, params
end
end
$RAILS_ROOT/spec/acceptance/api/articles_spec.rb
require File.dirname(__FILE__) + '/../acceptance_helper'
feature "Articles" do
background do
setup_driver
end
scenario 'update article' do
params = { :article => {} }
params[:article][:title] = 'foo'
put('/api/articles/1.json', params)
end
end
@driver.status_code とかでレスポンスのステータスコードが取得できたりします。
ほかの情報はここなどを読むとよいでしょう。
Class: Capybara::Driver::Base
参考文献
- Comments: 0
- Trackbacks: 0
JRuby で ActiveRecord 3 をちょこっと試す
- 2010-12-07 (Tue)
- Ruby
JRuby で ActiveRecord を試してみたいと思いました。
JRuby は RVM で 1.5.6 がインストールされています。
$ echo "rvm jruby" >> .rvmrc
こんな感じで .rvmrc を使用して JRuby 環境になっているものとします。
まずは ActiveRecord のインストール。
$ gem install activerecord Successfully installed activesupport-3.0.3 Successfully installed builder-2.1.2 Successfully installed i18n-0.5.0 Successfully installed activemodel-3.0.3 Successfully installed arel-2.0.6 Successfully installed tzinfo-0.3.23 Successfully installed activerecord-3.0.3 7 gems installed (...)
MySQL を使いたいので、普通の Ruby っぽく
$ gem install mysql
とやってみましたが、ダメでした。
$ gem install activerecord-jdbcmysql-adapter Successfully installed activerecord-jdbc-adapter-1.0.3-java Successfully installed jdbc-mysql-5.0.4 Successfully installed activerecord-jdbcmysql-adapter-1.0.3-java 3 gems installed (...)
こういうのを使う必要があるらしいです。
establish_connection のやり方も若干違います。
require 'rubygems' require 'active_record' ActiveRecord::Base.establish_connection( :adapter => 'jdbcmysql', :host => 'localhost', :username => 'root', :password => '', :database => 'piyopiyo_development', :pool => 5 )
あとは同じみたいです。
参考文献
- Comments: 0
- Trackbacks: 0
cURL で GET/POST/PUT/DELETE
- 2010-11-07 (Sun)
- Programming
-X オプションでメソッド名 GET/POST/PUT/DELETE を指定すればよい。
curl -X PUT -d 'example[foo]=bar' -d 'example[jane]=doe' http://example.com/api/1/example/1.json
Basic 認証をしたいときにはさらに –basic –user user:password をつける。
curl --basic --user user:password -X PUT -d 'example[foo]=bar' -d 'example[jane]=doe' http://example.com/api/1/example/1.json
API を開発したいときには cURL様々!!!
参考文献
- Comments: 0
- Trackbacks: 0
git でコミットを分解する
- 2010-11-02 (Tue)
- Programming
git を使うと、ブランチをさくさく切ることができてそのブランチにとりあえずコミットしておいて、後で適当にきれいにまとめ上げて master へマージするなんてことがお手軽にできます。
変なところが適当で、変なところには几帳面な自分にはまさに打って付けな感じで、Subversion とかではなかなかコミットできなかったものの、今はとりあえず途中であってもコミットして、あとで修正するなんてこともやっています。
作業途中でもコミットできるのは便利なのですが、依存関係の問題でコミットしたものの一部を取り出してコミットしなおして、その部分だけを他のブランチへ入れたいなんてことがありました。
言い換えれば branchA の HEAD^ を分解する、HEAD^ の中にある一部のファイルだけを取り出してコミットし直すというのが今回やりたいことです。
git checkout branchA git reset --soft HEAD^
–soft を使うとコミットのみを取り消すことができます。
ちなみに –hard はコミットをなかったことにするものですので、コミット自体消えてしまいます。
これで index に記録された状態にまで戻ります。
この状態で通常の git reset をすれば、index 記録前の状態に戻るので、今回必要なファイルを index に記録するようにすればいいです。
すなわち
git reset . git add foo git commit
ということになります。
後は残りの部分を通常と同じようにコミットし、必要な部分を cherry-pick すれば、今回やりたいことはできました。
参考文献
- Comments: 0
- Trackbacks: 0
Shibuya.lisp Hackathon #1 に参加しました
- 2010-10-26 (Tue)
- Programming
以前の会社は9月末で退職したのですが、一番残念だったのはそのとき社内に二人も LISPer がいた1 のに LISP を触らずにやめてしまったことでした。
LISP というか Scheme は以前ちょこっと SICP をやっていたときに触れていたのですが、それきりでした。
今回10/23に Shibuya.lisp Hackathon が開催され、その方たちが参加するということで、LISP を学ぶのにはいい機会だと思って、参加してみました。
結果的には、前職の社員、元社員が一同に介することができて、それもとても楽しいことでした。
Shibuya.lisp Hackathon #1 : ATND
SBCL という処理系をインストールしてある以外、何もわからないので、まず SLIME というものを komagata さんが書かれていた方法でインストール。
SLIME – komagata [p0t]
SLIME: The Superior Lisp Interaction Mode for Emacs
あとは、隣にいた komagata さんの作業を覗いていたり
あたりを写経していました。
なにごとも自分一人だと始めること自体がエネルギーが必要なので、こういう機会があって実際に始めてみられることがよかったです。
謎記号が少しわかるようになったのが嬉しいところです。
今度は 実践Common Lisp を読みたいです。
運営をしていただいた方々、会場を提供していただいたオラクル様、どうもありがとうございました!
- というか自分以外 LISPer [↩]
- Comments: 0
- Trackbacks: 0
Rails 3 で Paperclip Processor を使用する
- 2010-10-20 (Wed)
- Ruby on Rails
Paperclip は高機能なファイル添付のための Rails プラグインです。
thoughtbot’s paperclip at master – GitHub
単純にアップロードが行えるだけではなく、アップロードされたファイルを処理する Processor という仕組みがあります。
Railscasts でも紹介されています。
Railscasts – Cropping Images
この Processor を作成するには Paperclip::Processor というのを継承して、 $RAILS_ROOT/lib/paperclip_processors/hoge.rb みたいな場所に置きます。
この Processor の仕組みが今回必要だったので、 Rails 3 で動かしてみたところ、動いている気配がない。
そこで Processor not loading at first try with Rails3 – Paperclip Plugin というのを参考にして、以下のコードを書いてみたところ無事に読み込まれました。
Hoge::Application.configure do
config.after_initialize do
Dir.glob(File.join(File.expand_path(Rails.root), "lib", "paperclip_processors", "*.rb")).each do |processor|
require processor
end
end
end
これを config/initializers/paperclip.rb として置いておきました。
より詳しい Processor の作成方法については以下の blog に非常に詳しく書かれています。
動画をアップロードされたら ffmpeg でサムネイルを作成する方法について書かれていて、非常に参考になります。
Video thumbnails with FFmpeg and Paperclip – Ruby on Rails, JRuby, AWS, EC2, Exalead
注意点としては、 has_attached_file にちゃんと :styles プロパティを設定しておくこと。
これをしないと :processors => [ :hoge ] と書いても、その Processor は呼ばれません。
参考文献
- Comments: 0
- Trackbacks: 0
Rails 3 + Haml で production 環境下でもインデントする
- 2010-10-20 (Wed)
- Ruby on Rails
Haml をしようするときれいにインデントがされるから好きなんですが、Rails の production 環境下ではインデントがされません。
Haml2.2からはRailsのproductionでインデントが無いと少数派に呼びかけている – komagata [p0t]
速度が問題になるまではインデントしたいので、上記 komagata さんが書かれているように設定したものの、 Rails 3 では上手く動きませんでした。
config.after_initialize でくくらないといけないみたいです。
Hoge::Application.configure do
config.after_initialize do
Haml::Template::options[:ugly] = false
end
end
これを config/initializers/haml.rb に置きました。 1
config/application.rb や config/environments/production.rb の中でもいいですね(たぶん)。
- Hoge は適当なアプリケーション名に置き換えること。 [↩]
- Comments: 0
- Trackbacks: 0
Ruby 1.9.2 で aws-s3 を使用できなかった問題の解決策
- 2010-10-19 (Tue)
- Ruby
Ruby 1.9.2 が使いたいなぁと思って、いろいろとやっています。
Amazon S3 を使用したいと思って、手持ちの Mac に定番の aws-s3 をインストールして irb で試してみようとするとエラーが出て使用できませんでした。
marcel’s aws-s3 at master – GitHub
ところが Linux ではちゃんと動きます。
特にバイナリをビルドしている様子もないので、こちらの環境が悪いと判断しました。
環境
- Ruby 1.9.2 on RVM
エラー内容
irb > require 'aws/s3'
SyntaxError: /Users/piyo/.rvm/gems/ruby-1.9.2-p0/gems/aws-s3-0.6.2/lib/aws/s3/extensions.rb:84: invalid multibyte escape: /[
\x80-\xFF]/
from :29:in `require'
from :29:in `require'
from /Users/piyo/.rvm/gems/ruby-1.9.2-p0/gems/aws-s3-0.6.2/lib/aws/s3.rb:11:in `'
from :33:in `require'
from :33:in `rescue in require'
from :29:in `require'
from (irb):1
from /Users/piyo/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `'
解決策
.zshrc に RUBYOPT=-Ku が設定されていたので、その設定を外しました。
- Comments: 0
- Trackbacks: 0
Lokka を nginx + Unicorn で動かす
- 2010-10-15 (Fri)
- Ruby
Lokka は komagata さんが開発されている、Ruby で書かれた CMS です(旧名 Pyhä)。
以前書いたエントリのように、Lokka も nginx と Unicorn で動かしたいと思います。
cocoa*life – Redmine を nginx + Unicorn で動かしてみる
Lokka は Sinatra ベースなので Sinatra で動かすようにすればいいだけのようです。
Unicorn の設定
Lokka のディレクトリに unicorn.rb というファイルを作成しました。
unicorn.rb は前回の使用したものをほぼそのまま使用しました。
# ワーカーの数
worker_processes 2
# ソケット
listen '/tmp/unicorn-lokka.sock'
# ログ
stderr_path 'tmp/log/unicorn.log'
stdout_path 'tmp/log/unicorn.log'
# ダウンタイムなくす
preload_app true
before_fork do |server, worker|
old_pid = "#{ server.config[:pid] }.oldbin"
unless old_pid == server.pid
begin
# SIGTTOU だと worker_processes が多いときおかしい気がする
Process.kill :QUIT, File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
Unicorn を起動する
unicorn -c unicorn.rb -D
nginx の設定
nginx の設定は以下のようにしました。
upstream unicorn-lokka {
server unix:/tmp/unicorn-lokka.sock;
}
server {
listen 80;
server_name lokka.local;
location / {
if (-f $request_filename) { break; }
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn-lokka;
}
}
nginx を再起動する。
/usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx
参考文献
- Comments: 0
- Trackbacks: 0
Redmine を tag ごとに更新する
- 2010-10-15 (Fri)
- Programming
バグトラッキングシステムの Redmine を運用しています。
Redmine のレポジトリは以下の github で公開されています。
edavis10′s redmine at master – GitHub
ある程度の間隔で更新していきたいところですが、これは trunk なので、これを追っていくのははばかられます。
更新する場合には tag ごとに更新したい。
いまいちどうやってやればいいのかわからなかったので、わかる範囲でやってみました。
タグの一覧は次のコマンドで見ることができます。
git tag
まず公開レポジトリからタグを取得します。
git pull --tags
タグに対するリビジョンを取得します。
git rev-parse 1.0.2 b5cfe790446f9a6bdd968aa65289873f7668f7da
このリビジョンを checkout します。
git checkout b5cfe790446f9a6bdd968aa65289873f7668f7da
2010/11/10 追記
git rev-parse の部分は必要はなく
git checkout 1.0.2
で問題ありません。
参考文献
- Comments: 0
- Trackbacks: 0
