class FixtureBuilder::Builder

Public Class Methods

new(configuration, namer, builder_block) click to toggle source
# File lib/fixture_builder/builder.rb, line 6
def initialize(configuration, namer, builder_block)
  @configuration = configuration
  @namer = namer
  @builder_block = builder_block
end

Public Instance Methods

generate!() click to toggle source
# File lib/fixture_builder/builder.rb, line 12
def generate!
  say "Building fixtures"
  clean_out_old_data
  create_fixture_objects
  names_from_ivars!
  write_data_to_files
  after_build.call if after_build
end

Protected Instance Methods

clean_out_old_data() click to toggle source
# File lib/fixture_builder/builder.rb, line 69
def clean_out_old_data
  delete_tables
  delete_yml_files
end
create_fixture_objects() click to toggle source
# File lib/fixture_builder/builder.rb, line 23
def create_fixture_objects
  load_legacy_fixtures if legacy_fixtures.present?
  surface_errors { instance_eval &@builder_block }
end
delete_tables() click to toggle source
# File lib/fixture_builder/builder.rb, line 74
def delete_tables
  ActiveRecord::Base.connection.disable_referential_integrity do
    tables.each { |t| ActiveRecord::Base.connection.delete(delete_sql % {table: ActiveRecord::Base.connection.quote_table_name(t)}) }
  end
end
delete_yml_files() click to toggle source
# File lib/fixture_builder/builder.rb, line 80
def delete_yml_files
  FileUtils.rm(*tables.map { |t| fixture_file(t) }) rescue nil
end
dump_empty_fixtures_for_all_tables() click to toggle source
# File lib/fixture_builder/builder.rb, line 88
def dump_empty_fixtures_for_all_tables
  tables.each do |table_name|
    write_fixture_file({}, table_name)
  end
end
dump_tables() click to toggle source
# File lib/fixture_builder/builder.rb, line 94
def dump_tables
  default_date_format = Date::DATE_FORMATS[:default]
  Date::DATE_FORMATS[:default] = Date::DATE_FORMATS[:db]
  begin
    fixtures = tables.inject([]) do |files, table_name|
      table_klass = table_name.classify.constantize rescue nil
      if table_klass && table_klass < ActiveRecord::Base
        rows = table_klass.unscoped do
          table_klass.all.collect do |obj|
            attrs = obj.attributes.select { |attr_name| table_klass.column_names.include?(attr_name) }
            attrs.inject({}) do |hash, (attr_name, value)|
              hash[attr_name] = serialized_value_if_needed(table_klass, attr_name, value)
              hash
            end
          end
        end
      else
        rows = ActiveRecord::Base.connection.select_all(select_sql % {table: ActiveRecord::Base.connection.quote_table_name(table_name)})
      end
      next files if rows.empty?

      row_index = '000'
      fixture_data = rows.inject({}) do |hash, record|
        hash.merge(record_name(record, table_name, row_index) => record)
      end

      write_fixture_file fixture_data, table_name

      files + [File.basename(fixture_file(table_name))]
    end
  ensure
    Date::DATE_FORMATS[:default] = default_date_format
  end
  say "Built #{fixtures.to_sentence}"
end
fixture_file(table_name) click to toggle source
# File lib/fixture_builder/builder.rb, line 156
def fixture_file(table_name)
  fixtures_dir("#{table_name}.yml")
end
fixtures_class() click to toggle source

Rails 3.0 and 3.1+ support

# File lib/fixture_builder/builder.rb, line 36
def fixtures_class
  if defined?(ActiveRecord::FixtureSet)
    ActiveRecord::FixtureSet
  elsif defined?(ActiveRecord::Fixtures)
    ActiveRecord::Fixtures
  else
    ::Fixtures
  end
end
load_legacy_fixtures() click to toggle source
# File lib/fixture_builder/builder.rb, line 28
def load_legacy_fixtures
  legacy_fixtures.each do |fixture_file|
    fixtures = fixtures_class.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
    populate_custom_names(fixtures)
  end
end
names_from_ivars!() click to toggle source
# File lib/fixture_builder/builder.rb, line 57
def names_from_ivars!
  instance_values.each do |var, value|
    name(var, value) if value.is_a? ActiveRecord::Base
  end
end
say(*messages) click to toggle source
# File lib/fixture_builder/builder.rb, line 84
def say(*messages)
  puts messages.map { |message| "=> #{message}" }
end
serialized_value_if_needed(table_klass, attr_name, value) click to toggle source
# File lib/fixture_builder/builder.rb, line 130
def serialized_value_if_needed(table_klass, attr_name, value)
  if table_klass.respond_to?(:type_for_attribute)
    if table_klass.type_for_attribute(attr_name).type == :jsonb || table_klass.type_for_attribute(attr_name).type == :json
      value
    elsif table_klass.type_for_attribute(attr_name).respond_to?(:serialize)
      table_klass.type_for_attribute(attr_name).serialize(value)
    elsif table_klass.type_for_attribute(attr_name).respond_to?(:type_cast_for_database)
      table_klass.type_for_attribute(attr_name).type_cast_for_database(value)
    else
      table_klass.type_for_attribute(attr_name).type_cast_for_schema(value)
    end
  else
    if table_klass.serialized_attributes.has_key? attr_name
      table_klass.serialized_attributes[attr_name].dump(value)
    else
      value
    end
  end
end
surface_errors() { || ... } click to toggle source
# File lib/fixture_builder/builder.rb, line 46
def surface_errors
  yield
rescue Object => error
  puts
  say "There was an error building fixtures", error.inspect
  puts
  puts error.backtrace
  puts
  exit!
end
write_data_to_files() click to toggle source
# File lib/fixture_builder/builder.rb, line 63
def write_data_to_files
  delete_yml_files
  dump_empty_fixtures_for_all_tables if write_empty_files
  dump_tables
end
write_fixture_file(fixture_data, table_name) click to toggle source
# File lib/fixture_builder/builder.rb, line 150
def write_fixture_file(fixture_data, table_name)
  File.open(fixture_file(table_name), 'w') do |file|
    file.write fixture_data.to_yaml
  end
end