くりにっき

フルスタックキュアエンジニアです

Padrinoでar:migrate時に自動的にannotateする

annotate_modelsの紹介

annotate_models を使うとmodelにスキーマ情報が付加されて見やすくなるので自分の観測範囲だとよく使われています。

# == Schema Information
#
# Table name: users
#
#  id             :integer          not null, primary key
#  gitlab_user_id :integer
#  username       :string(255)
#  email          :string(255)
#  private_token  :string(255)
#  created_at     :datetime
#  updated_at     :datetime
#
# Indexes
#
#  index_users_on_gitlab_user_id  (gitlab_user_id) UNIQUE
#

Railsだと rake db:migraterake db:rollback 時に自動的にannotateを実行するコードがgithubwikiで紹介されています。

https://github.com/ctran/annotate_models/wiki

最近Padrinoでアプリ作り始めたのですが、Railsみたいにmigrateで自動的にannotateする方法を作ってみました。

Padrinoでar:migrate時に自動的にannotateする方法

lib/tasks/annotate.rake

lib/tasks/ にrakeファイルを置いておくと自動的にロードされるのでこんな感じでrakeファイルを置く

desc "annotate models"
task :annotate => :environment do
  require 'annotate/annotate_models'

  AnnotateModels.do_annotations(
      model_dir:         "#{__dir__}/../../models/",
      exclude_fixtures:  true,
      exclude_factories: true,
      exclude_tests:     true,
      show_indexes:      true,
      format_markdown:   false
  )
end

Rakefile

PadrinoTasks.init の直後に下記を書く

require "padrino-core"
if Padrino.env == :development
  Rake::Task['ar:migrate'].enhance do
    Rake::Task['annotate'].invoke
  end
 
  Rake::Task['ar:rollback'].enhance do
    Rake::Task['annotate'].invoke
  end
end

Padrinoの初期化順の関係からか、 lib/tasks/annotate.rake の中にフックする処理が書けませんでした。。。 他にうまいやり方ありますかねぇ?>有識者

gists

https://gist.github.com/sue445/2c6d0d7ddce9fdb64632