lib/flextures/flextures.rb in flextures-1.0.6 vs lib/flextures/flextures.rb in flextures-1.0.8

- old
+ new

@@ -11,13 +11,21 @@ LOAD_DIR = Config.fixture_load_directory DUMP_DIR = Config.fixture_dump_directory # テーブルモデルの作成 def self.create_model table_name - klass = Class.new ActiveRecord::Base - klass.table_name=table_name - klass + a = proc { + begin + table_name.singularize.camelize.constantize + rescue => e + nil + end + } + b = proc { + Class.new(ActiveRecord::Base){ |o| o.table_name=table_name } + } + a.call || b.call end # 設定ファイルが存在すればロード def self.init_load if defined?(Rails) and Rails.root @@ -173,20 +181,18 @@ file_name = format[:file] || table_name dir_name = format[:dir] || LOAD_DIR inpfile = "#{dir_name}#{file_name}.csv" klass = PARENT::create_model table_name attributes = klass.columns.map &:name - filter = create_filter klass.columns, Factory[table_name] + filter = create_filter klass, Factory[table_name] klass.delete_all CSV.open( inpfile ) do |csv| keys = csv.shift # keyの設定 warning "CSV", attributes, keys csv.each do |values| h = values.extend(Extensions::Array).to_hash(keys) - h = filter.call h - o = klass.new - h.each{ |k,v| o[k]=v } + o = filter.call h o.save end end end @@ -196,17 +202,15 @@ file_name = format[:file] || table_name dir_name = format[:dir] || LOAD_DIR inpfile = "#{dir_name}#{file_name}.yml" klass = PARENT::create_model table_name attributes = klass.columns.map &:name - filter = create_filter klass.columns, Factory[table_name] + filter = create_filter klass, Factory[table_name] klass.delete_all YAML.load(File.open(inpfile)).each do |k,h| warning "YAML", attributes, h.keys - h = filter.call h - o = klass.new - h.each{ |k,v| o[k]=v } + o = filter.call h o.save end end # 欠けたカラムを検知してメッセージを出しておく @@ -214,29 +218,30 @@ (attributes-keys).each { |name| print "Warning: #{format} colum is missing! [#{name}]\n" } (keys-attributes).each { |name| print "Warning: #{format} colum is left over! [#{name}]\n" } end # フィクスチャから取り出した値を、加工して欲しいデータにするフィルタを作成して返す - def self.create_filter columns, factory=nil + def self.create_filter klass, factory=nil + columns = klass.columns # テーブルからカラム情報を取り出し column_hash = {} columns.each { |col| column_hash[col.name] = col } # 自動補完が必要なはずのカラム lack_columns = columns.select { |c| !c.null and !c.default }.map{ |o| o.name.to_sym } not_nullable_columns = columns.select { |c| !c.null }.map &:name # ハッシュを受け取って、必要な値に加工してからハッシュで返すラムダを返す return->(h){ - h.select! { |k,v| column_hash[k] } # テーブルに存在しないキーが定義されているときは削除 + # テーブルに存在しないキーが定義されているときは削除 + h.select! { |k,v| column_hash[k] } + o = klass.new # 値がnilでないなら型をDBで適切なものに変更 - h.each{ |k,v| nil==v || h[k] = TRANSLATER[column_hash[k].type].call(v) } - not_nullable_columns.each{ |k| h[k]==nil && h[k] = TRANSLATER[column_hash[k].type].call(k) } + h.each{ |k,v| nil==v || o[k] = TRANSLATER[column_hash[k].type].call(v) } + not_nullable_columns.each{ |k| o[k]==nil && o[k] = TRANSLATER[column_hash[k].type].call(k) } # FactoryFilterを動作させる - st = OpenStruct.new(h) - factory.call(st) if factory - h = st.to_hash + factory.call(o) if factory # 値がnilの列にデフォルト値を補間 - lack_columns.each { |k| nil==h[k] && h[k] = COMPLETER[column_hash[k].type].call } - h + lack_columns.each { |k| nil==o[k] && o[k] = COMPLETER[column_hash[k].type].call } + o } end end end