basyura's blog

あしたになったらほんきだす。

redmine_client

ActiveResource すごい。
redmine_client ってホントに小さなライブラリなのに、redmine の API にアクセスできちゃう。
サンプルプログラム

#!ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'redmine_client'

RedmineClient::Base.configure do
  self.site     = 'http://xxx.xxx.xxx.xxx/'
  self.user     = 'userid'
  self.password = 'password'
end

issue = RedmineClient::Project.find(:all).each do |project|
  p project.id
  p project.name
  p project.identifier
  p project.description
  p project.created_on
  p project.updated_on
end


issue = RedmineClient::Issue.find(150)
p issue.id
p issue.project.name
p issue.tracker.name
p issue.status.name
p issue.priority.name
p issue.author.name
p issue.assigned_to.name
p issue.subject
p issue.description
p issue.start_date
p issue.due_date
p issue.done_ratio
p issue.estimated_hours
p issue.custom_fields.custom_field
p issue.created_on
p issue.updated_on

RedmineClient::Issue.find(:all).each do |issue|
  puts issue.id
  puts issue.project.name
  puts issue.description
end

こんな感じで、ActiveRecord のように操作できる。
肝心のライブラリはというと

redmine_client.rb

require 'active_resource'

require 'redmine_client/base'
require 'redmine_client/project'
require 'redmine_client/issue'
require 'redmine_client/news'

base.rb

module RedmineClient
  class Base < ActiveResource::Base
    def self.configure(&block)
      instance_eval &block
    end
  end
end

project.rb

module RedmineClient
  class Project < RedmineClient::Base
  end
end

issue.rb

module RedmineClient
  class Issue < RedmineClient::Base
  end
end

news.rb

module RedmineClient
  class News < RedmineClient::Base
  end
end

たったのこれだけ。すげえ。ActiveResource 頑張りすぎ。ただ、ここまで簡単にできるためには API が rails の作法に従っていないとだめなんだけど、これについての説明は下記のサイトがとっても分かりやすかった。

URL というのはそもそもリソースの場所を表すもので、それに対する操作は HTTP メソッドで指定するべきだ、という REST の思想を実現するためです。しかしまあ、それはさておき、 ActiveResource 的に重要なことは、これによって「あるリソースへのアクセスが単一の URL で行え、しかもその URL が一定の規則を持っている」点です。

ActiveResource の使い方(前編) : Rails 同士で通信する

REST に関しては

を読み返したいところ。
Railsレシピブック 183の技

Railsレシピブック 183の技

Amazon
ActiveResource についてはこちらにも記述があるので読み返してみた。
Rails3 対応版がでないかなぁ (´・ω・`)