以前、RedMineのwikiをコマンドラインから更新する記事を書いた。
前回までの記事はコマンドラインからの更新だった。
今回はRubyからの更新を試してみた。

 前回はRESTのバグ?仕様?に悩まされたので、環境をメモっておく。

Redmine  : 3.0.0.stable
Ruby : 2.2.1-p85 (2015-02-26) [x86_64-linux-gnu] 
これまでの記事にあった、コマンドからの更新ではXMLを書かなくてはいけないのが苦痛だった。
今回はRubyを使うので、XMLの整形周りについてはライブラリを使用できるので楽ちんだ。

やることはコマンドラインと対して変わらない。

コードは以下の通り。
#!/usr/bin/ruby

require 'net/http'
require 'uri'
require 'builder/xmlmarkup'

# 個人設定
api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
project = 'test_project'
page    = 'test_page'
textile = File.open("test_page.textile","rb").read

# 共通設定
url = 'http://localhost/redmine/projects/'+project+'/wiki/'+page+'.xml'

# XML作成
xml_obj = ''
xml = Builder::XmlMarkup.new(:target=>xml_obj, :indent=>0)
xml.instruct!
xml.wiki_page{ xml.text("\n"+textile) }

# REST
uri = URI.parse(url)
Net::HTTP.start(uri.host ,uri.port) do |http|
    request = Net::HTTP::Put.new(uri.path)
    request.set_content_type('application/xml')
    request['X-Redmine-API-Key'] = api_key
    request.body = xml_obj
    response = http.request(request)
end

XML作成にxmlmarkupというライブラリを使用した。
読み込ませたtest_page.textileにはpreタグなどもありどうなるかと思ったが、ちゃんとエスケープしてくれた。

test_page.textile サンプル:
<pre>
Usage: hoge_create [options]

ほげほげ

</pre>
 
生成したxml_objをputsしてみると、以下のようになっていた。
<!--?xml version="1.0" encoding="UTF-8"?--><wiki_page><text>
&lt;pre&gt;
Usage: hoge_create [options]

ほげほげ

&lt;/pre&gt;
</text></wiki_page>
これでtextileをRuby内で生成し、一気にWikiへ反映させることができそうだ。
RedmineのWikiは便利だが更新するのが面倒。だが、Jenkinsと連携すればファイルリストやUsage、ちょっとしたコードの解析結果などを任せることができそうだ。