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