lib/ez/schema_modifier.rb in ez-1.3.0 vs lib/ez/schema_modifier.rb in ez-1.5.0.2

- old
+ new

@@ -45,11 +45,11 @@ false end def tables - @tables ||= (db.tables - ['schema_migrations']) + @tables ||= (db.data_sources - ['schema_migrations', 'ar_internal_metadata']) end def missing_model?(model_name) missing_table?(model_name.tableize) end @@ -71,72 +71,80 @@ def display_change(message) puts message unless @silent @changed = true end - def add_missing_columns(model_name, columns, assume_missing = false) + def add_missing_columns(model_name, spec_columns, assume_missing = false) table_name = model_name.tableize db_columns = db.columns(table_name) - columns.each do |col_name, data| - col_type = data[:type].to_sym - col_default = data[:default] + spec_columns.each do |col_name, col_spec| + col_type = col_spec[:type].to_sym + col_default = col_spec[:default] db_col = !assume_missing && (db_columns.detect { |dbc| dbc.name == col_name }) if !db_col if !assume_missing - display_change "Adding new column '#{col_name}' as #{col_type} for model #{model_name}" + display_change "Adding new column '#{col_name}' as #{col_type} in model #{model_name}" end opts = { default: col_default } - opts[:limit] = data[:limit] if data[:limit] + opts[:limit] = col_spec[:limit] if col_spec[:limit] db.add_column(table_name, col_name.to_sym, col_type.to_sym, opts) unless @dry_run - if data[:index] + if col_spec[:index] display_change " (adding database index for '#{col_name}')" db.add_index table_name, col_name.to_sym unless @dry_run end else if db_col.type != col_type - display_change "Changing column type for #{col_name} to #{col_type} for model #{model_name}" + display_change "Changing column type for #{col_name} to #{col_type} in model #{model_name}" end # puts "#{table_name} #{col_name}: #{db_col.default} and #{col_default}" - if db_col.default != col_default + if col_type == :boolean + db_col_default = db_col.default.in?(EZ::COLUMN_TRUE_VALUES) + end + + if db_col_default != col_default displayable_value = col_default displayable_value = "NULL" if col_default.nil? - display_change "Applying new default value #{displayable_value} for #{col_name} for model #{model_name}" + display_change "Applying new default value `#{displayable_value}` for #{col_name} attrbute in model #{model_name}" end if (db_col.type != col_type) || (db_col.default != col_default) opts = { default: col_default } - opts[:limit] = data[:limit] if data[:limit] + opts[:limit] = col_spec[:limit] if col_spec[:limit] db.change_column(table_name, col_name.to_sym, col_type.to_sym, opts) unless @dry_run end end end end - def add_model(model_name, columns) + def add_model(model_name, spec_columns) table_name = model_name.tableize display_change "Defining new table for model '#{model_name}'." db.create_table table_name unless @dry_run - add_missing_columns model_name, columns, true + add_missing_columns model_name, spec_columns, true filename = "app/models/#{model_name.underscore}.rb" - unless Rails.env.production? || File.exists?(filename) + if (Rails.env.development? || Rails.env.test?) && !File.exists?(filename) display_change "Creating new model file: #{filename}" File.open(filename, "w") do |f| f.puts "class #{model_name} < ActiveRecord::Base" f.puts "end" end end end def remove_dead_schema + return unless Rails.env.development? || Rails.env.test? + remove_dead_tables remove_dead_columns end def remove_dead_columns + return unless Rails.env.development? || Rails.env.test? + tables.each do |table_name| model_name = table_name.classify.to_s if @spec.has_key?(model_name) db_columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at] @@ -159,9 +167,11 @@ # db.initialize_schema_migrations_table # db.assume_migrated_upto_version(Time.now.utc.strftime("%Y%m%d%H%M%S")) end def remove_dead_tables + return unless Rails.env.development? || Rails.env.test? + tables_we_need = @spec.keys.map { |model| model.tableize } dead_tables = tables - tables_we_need dead_tables.each do |table_name| model_name = table_name.classify