Redmine本体のリファレンスをバージョン情報付きで生成する

この記事は Redmine Advent Calendar 2018の12/15分です。今日はRedmineプラグイン開発用にRedmineのドキュメントにバージョン情報(いつから使えるか)を含めるというお話しです。以下の画像右側のような感じです。yardにuntilタグがないので、ちょっと見た目が悪いですね...

f:id:sho-hashimoto:20181216093519p:plain:w300f:id:sho-hashimoto:20181216093941p:plain:w300
バージョン情報追加前→後

これはRedmine本体のIssue#each_notificationが2.4.0から4.0.0の間で使える事を示しています。

それらを機械的Redmineのバージョンごとに見れるようにしたものが以下です。

とりあえずまとめ

リンク先もしくは画像にあるようにSince やDeprecatedのような情報が確認できるようになりましたので、Redmineプラグインのメンテナンスに使ってみようかと思っています。 ところでこれを yardoc.redmine.jp/Redmine/<redmine_ver>/以下かGitHubミラーのgh-pages(まだない)などで公開したいような気もしますね*1機械的に付与してる情報ですし、リリース毎に一回更新するだけだから、メンテナンスも難しくないので。

明日は @onozaty さんの予定です。お楽しみにー。

蛇足(やりかた)

以降はどうやって生成したかです。気になる人向け。

  1. Redmine本体のリファレンスの生成
  2. バージョン情報がないのでねじ込む

1. Redmine本体のリファレンスの生成

Redmineのリファレンスはyardで記述されています(正確にはrdocとyardのドキュメントが混在しているのですが...)。production環境以外ならbundle install後すぐに以下のコマンドでdoc/app以下にリファレンスを生成できます。

$ bundle exec rake yard

この後でdoc/app/index.htmlを開くとリファレンスが参照できます。なお、ありがたい事にここまでの情報は以下で公開されています。

ただし、このままだと現状のメソッドに関する記述はわかりますが、それぞれのメソッドがいつから使えるかわかりません*2。僕自身もredmine_auditという運用中のRedmineで更新が必要な脆弱性の対応がリリースされたら通知してくれるプラグインを作っているのですが、そこではRuby x Redmineの組み合わせ単体テストを実行しています。ですが、そもそもRedmine本体のメソッドを使う前にもう少し情報が欲しい感じです。

2. バージョン情報がないのでねじ込む

という事で生成時に機械的にねじ込みます。大まかには以下のようにするだけです。

  1. yardで各バージョンの.yardocを生成
  2. yard diffで各バージョンの.yardocを比較してバージョン情報の一覧を生成
  3. yardocのテンプレートを修正してリファレンス生成時にバージョン情報をねじ込み

バージョン情報の一覧はここに置きました。この辺は細かい話しは別記事を参照してください。最後にどうバージョン情報をねじ込むかですが、yardocは自分で作ったテンプレートが指定できます。それとバージョン情報の一覧を混ぜてやれば完成です。今回はテンプレート内でYARDの各種オブジェクト(MethodObjectなど)にadd_tagしているだけです。強引すぎる。

具体的には以下でやっています。この修正自体はRedmine本体をforkして入れてますけど、プラグインにしてタスクだけ生やしてしまうのがいいかもしれませんね。

ところで yard diff@sinceタグ を組み合わせるこの手順はRedmineに限らず使えるので便利ですね。(本当におしまい)

2018/12/16: 画像や文言等を少し修正。

*1:後日ここでチケットにしました

*2:本記事の前にパッチは投げたんだけど、手動で付与するのは大変など微妙な感じだったので諦めた