Class: Arxutils::Migrate::Migratex

Inherits:
Object
  • Object
show all
Defined in:
lib/arxutils/migrate.rb

Overview

migrate用のスクリプトの内容をテンプレートから作成し、ファイルに出力し、migrateを実行する

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(db_dir, migrate_base_dir, src_config_dir, dbconfig, env, log_fname, opts) ⇒ Migratex

migrate用のスクリプトの生成、migrateの実行を行うmigratexの生成



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/arxutils/migrate.rb', line 65

def initialize( db_dir , migrate_base_dir , src_config_dir , dbconfig, env, log_fname, opts )
  # DB接続までの初期化を行うDbinitクラスのインスタンス
  @dbinit = Dbutil::Dbinit.new( db_dir , migrate_base_dir , src_config_dir , dbconfig, env, log_fname, opts )
  # 生成するDB構成情報ファイルパス
  @dbconfig_dest_path = @dbinit.dbconfig_dest_path
  # 参照用DB構成情報ファイル名
  @dbconfig_src_fname = @dbinit.dbconfig_src_fname

  # migrate用スクリプトの出力先ディレクトリ名
  @migrate_dir = @dbinit.migrate_dir
  # テンプレートファイル格納ディレクトリ名
  @src_path = Arxutils.templatedir
  # 構成ファイル格納ディレクトリ
  @src_config_path = Arxutils.configdir
end

Instance Attribute Details

#dbinitObject (readonly)

DB接続までの初期化を行うDbinitクラスのインスタンス



62
63
64
# File 'lib/arxutils/migrate.rb', line 62

def dbinit
  @dbinit
end

Instance Method Details

#convert(data, src_dir, src_fname) ⇒ Object

テンプレートファイルからスクリプトの内容に変換



87
88
89
90
91
# File 'lib/arxutils/migrate.rb', line 87

def convert( data , src_dir , src_fname )
  arx = Arx.new( data , File.join( src_dir, src_fname ) )
  # 指定テンプレートファイルからスクリプトの内容に作成
  arx.create
end

#convert_count_class_relation(data, src_fname) ⇒ Object

Countクラス用のrelationのスクリプトの内容に変換



82
83
84
# File 'lib/arxutils/migrate.rb', line 82

def convert_count_class_relation( data , src_fname )
  convert( data , @src_path , src_fname )
end

#make_dbconfig(data) ⇒ Object

データベース構成ファイルをテンプレートから生成する



94
95
96
97
98
99
# File 'lib/arxutils/migrate.rb', line 94

def make_dbconfig( data )
  content = convert( data , @src_config_path , @dbconfig_src_fname )
  File.open( @dbconfig_dest_path , 'w' , {:encoding => Encoding::UTF_8}){ |f|
    f.puts( content )
  }
end

#make_relation(data, count_classname_downcase) ⇒ Object

英子文字で表現したクラス名が、countを表していなければ、relationを英子文字で表現したクラス名が、countを表していれが、空のハッシュを返すスキーマでbase, noitem以外のフィールドが指定されていれば、そのフィールドに対するrelationの設定の内容を返す



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/arxutils/migrate.rb', line 104

def make_relation( data , count_classname_downcase )
  if data[:classname_downcase] != count_classname_downcase
    # 指定フィールドのフィールド名に対応したテンプレートファイルを用いて、relation設定を作成
    data[:flist].reduce( { content: [], need_count_class: nil } ){ |s, field_name|
      case field_name
      when "base" , "noitem"
        name_base = "relation"
        # data[:relation]がnilに設定されていたら改めて空の配列を設定
        data[:relation] = [] unless data[:relation]
      else
        data[:count_classname_downcase] = count_classname_downcase
        name_base = "relation_#{field_name}"
        s[:need_count_class_plural] ||= data[:plural]
      end
      # テンプレートファイルからスクリプトの内容を作成
      content = convert( data , @src_path , "#{name_base}.tmpl" )
      s[:content] << content
      s
    }
  else
    {}
  end
end

#make_script_group(data) ⇒ Object

スキーマ設定からmigarte用スクリプトの内容を生成



129
130
131
# File 'lib/arxutils/migrate.rb', line 129

def make_script_group( data )
  data[:flist].map{ |kind| [kind, convert( data , @src_path , "#{kind}.tmpl" ), data[:classname_downcase]]}
end

#migrateObject

migrateを実行する



163
164
165
# File 'lib/arxutils/migrate.rb', line 163

def migrate
  ActiveRecord::Migrator.migrate(@migrate_dir ,  ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
end

#output_relation_script(content_array, opts) ⇒ Object

relationのスクリプトをファイル出力する



148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/arxutils/migrate.rb', line 148

def output_relation_script( content_array , opts )
  dir = opts[:dir]
  fname = opts[:filename]
  fpath = File.join( dir , fname )
  File.open( fpath , "w" ){ |file|
    opts[:module].map{|mod| file.puts("module #{mod}")}
    content_array.map{|x|
      file.puts x
      file.puts ""
    }
    opts[:module].map{|mod| file.puts("end")}
  }
end

#output_script(idy, kind, content, classname_downcase) ⇒ Object

migrationのスクリプトをファイル出力する



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/arxutils/migrate.rb', line 134

def output_script( idy, kind , content , classname_downcase )
    case kind
    when "base" , "noitem"
      additional = ""
    else
      additional = kind
    end
    fname = File.join( @migrate_dir , sprintf("%03d_create_%s%s.rb" , idy , additional , classname_downcase) )
    File.open( fname , 'w' , **{:encoding => Encoding::UTF_8}){ |f|
      f.puts( content )
    }
end