unshiu

最近の更新履歴

開発ルール‎ > ‎

プラグインルール


unshiuの各機能としての作成したプラグインの共通ルールをまとめます。


基本ルール

プラグインごとに接頭詞をもち、関係ファイル、ディレクトリにはかならず接頭詞をつけます。

例)

base_user
dia_entry


以下が一覧です。

 パッケージ名 パッケージ略称(接頭詞) パッケージの役割
 ユーザ管理 base ユーザ管理の基本となるパッケージ
 プロフィール prf プロフィールの記述・閲覧
 メッセージ msg メッセージの送受信やゴミ箱など
 ポイント pnt ユーザにポイントの付与や履歴を残す
 日記 dia 日記の記述・閲覧や公開レベルを設定する
 アルバム abm 画像のアルバム、画像へのコメントや説明、アルバム単位の公開レベルを設定する
 コミュニティ cmm コミュニティの作成・公開レベルの設定、トピックの作成・コメントができるようにする
 メールマガジン mlg メールマガジンをユーザに送信したり、送信結果を確認できる
 mixiアプリ         mixi mixiアプリ関連
 管理 mng 管理機能全般

以降、本稿では plugin_name という記述をした場合、接頭詞の名前を指します。

プラグイン構成

全てのプラグインは以下の構成になっています
#{plugin_name}/db/migrate                                             # migrationファイル
              /generators/#{plugin_name}/#{plugin_name}_generator.rb
                                        /templates/                   # generateした際にコピーするファイルを置きます。
              /lib/#{plugin_name}/                                    # module化したライブラリを置きます
              /test                                                   # module化したテスト系を置きます


プラグイン作成方法

前提

プラグイン化の条件は unit, functional, 最低限の integration テストが書かれていることが必須です。

プラグイン管理generatorをインストール

$ ruby script/plugin install git://github.com/unshiu/peeled-unshiu-plugin-template-generator.git

プラグインの雛形を作成

$ ruby script/plugin generate #{plugin_name}

UnshiuPluginTemplateGeneratorの実行

$ ruby script/generate unshiu_plugin_template_generator #{plugin_name}

UnshiuPluginTemplateGeneratorは指定された接頭詞のファイルを以下のディレクトリにコピーする機能を持っています。

#{RAILS_ROOT}/vendor/#{plugin_name}/generators/#{plugin_name}/templates

module化

module化は一番最初にプラグインを作成するときのみ必要な作業です。プラグイン作成後は必要に応じて手動でmoduleを追加することになります。
  • templates/app 以下にコピーされたファイルのうち拡張子が .rb のものを lib 以下にコピー
UnshiuPluginTemplateGeneratorによって必要ファイルはコピーされました。このうちmodule化が必要な .rb ファイルのみ lib に移動します。
  • templates/test 以下にコピーされたファイルのうち拡張子が .rb のものを test 以下にコピー
templates/app 以下と同様です。
  • test/ 以下を module化
先にtestをmodule化します。作業としては以下のようになります。
  1. 定義を class から module に変更
  2. 末尾にModuleを加える
  3. 継承は削除する

module HogeTestModule

 class << self
   def included(base)
     # モジュールをクラスメソッドとして追加する
     base.extend(ClassMethods)

     base.class_eval do
       # fixtures などクラスメソッドの呼び出し
       #   ex) fixtures :hoges
     end
   end
 end

 # テストメソッド
 def test_hoge
 end

end

  • templates/test 以下のファイルはmoduleをincludeするようにする
require File.dirname(__FILE__) + '/../../vendor/plugins/plugin_name/test/functional/hoge_test.rb'

class Hoge < Test::Unit::TestCase
  include hogeTestModule
end


この時点でまずテストが通ることを確認してください。
  • lib以下の対象ファイルをmodule化
作業としてはtestのmodule化と同様に以下のようになります。
  1. 定義を class から module に変更
  2. 末尾にModuleを加える
  3. 継承は削除する
module HogeModule

 class << self
   def included(base)
     # モジュールをクラスメソッドとして追加する
     base.extend(ClassMethods)

     base.class_eval do
       # before_filter などクラスメソッドの呼び出し
       #   ex) before_filter :login_required

       # 定数はメソッド内で定義できないので const_set を使って宣言
       #   const_set('CONST_NAME', ...)
       #   ex)
       #     const_set('SIZE', 10)

       # 特殊な処理が必要な場合
       # ・この領域で ActionController や ActiveRecord の定数を利用している
       #  ⇒フルネームで書く
       # ・この領域で定義した定数をこの領域内で利用している
       #   ⇒base:: をつける
       #  ex)
       #     base::STATUS_ACTIVE
     end
   end
 end

 module ClassMethods
   # クラスメソッドは classMethods内に定義する
   # self がついている場合はselfを削除すること
 end

end

  • templates 以下のファイルはmoduleをincludeするようにする
class Hoge < ActiveRecord::Base
  include hogeModule
end

  • テストが通ることを確認
対象クラスのテストが通ることを確認してください。うまく通らない場合はmodule化になにかしら問題が発生しています。

  • migrateファイルを整理
db/migrate 以下に関連するmigrateファイルをコピーします。

一番最初にplugin化する際は最終的なバージョンのテーブル情報さえあればいいので、db/shema.rbの情報から作成して下さい。