Sha256: 3f77cf081335628e7de62c348ddf3474ebca8c3325230a7bd09c55475f563a99

Contents?: true

Size: 1.79 KB

Versions: 16

Compression:

Stored size: 1.79 KB

Contents

module ModelBuilder
  def self.included(example_group)
    example_group.class_eval do
      before do
        @created_tables ||= []
      end

      after do
        drop_created_tables
        ActiveSupport::Dependencies.clear
      end
    end
  end

  def create_table(table_name, options = {}, &block)
    connection = ActiveRecord::Base.connection

    begin
      connection.execute("DROP TABLE IF EXISTS #{table_name}")
      connection.create_table(table_name, options, &block)
      @created_tables << table_name
      connection
    rescue Exception => e
      connection.execute("DROP TABLE IF EXISTS #{table_name}")
      raise e
    end
  end

  def define_model_class(class_name, &block)
    define_class(class_name, ActiveRecord::Base, &block)
  end

  def define_active_model_class(class_name, options = {}, &block)
    define_class(class_name) do
      include ActiveModel::Validations

      options[:accessors].each do |column|
        attr_accessor column.to_sym
      end

      if block_given?
        class_eval(&block)
      end
    end
  end

  def define_model(name, columns = {}, &block)
    class_name = name.to_s.pluralize.classify
    table_name = class_name.tableize
    table_block = lambda do |table|
      columns.each do |name, type|
        table.column name, type
      end
    end

    if columns.key?(:id) && columns[:id] == false
      columns.delete(:id)
      create_table(table_name, :id => false, &table_block)
    else
      create_table(table_name, &table_block)
    end

    define_model_class(class_name, &block)
  end

  def drop_created_tables
    connection = ActiveRecord::Base.connection

    @created_tables.each do |table_name|
      connection.execute("DROP TABLE IF EXISTS #{table_name}")
    end
  end
end

RSpec.configure do |config|
  config.include ModelBuilder
end

Version data entries

16 entries across 15 versions & 2 rubygems

Version Path
shoulda-matchers-2.4.0 spec/support/model_builder.rb
shoulda-matchers-2.4.0.rc1 spec/support/model_builder.rb
shoulda-matchers-2.3.0 spec/support/model_builder.rb
challah-1.0.0 vendor/bundle/gems/shoulda-matchers-2.2.0/spec/support/model_builder.rb
shoulda-matchers-2.2.0 spec/support/model_builder.rb
challah-1.0.0.beta3 vendor/bundle/gems/shoulda-matchers-2.1.0/spec/support/model_builder.rb
challah-1.0.0.beta3 vendor/bundle/gems/shoulda-matchers-1.5.6/spec/support/model_builder.rb
shoulda-matchers-2.1.0 spec/support/model_builder.rb
challah-1.0.0.beta2 vendor/bundle/gems/shoulda-matchers-1.5.6/spec/support/model_builder.rb
challah-1.0.0.beta vendor/bundle/gems/shoulda-matchers-1.5.6/spec/support/model_builder.rb
shoulda-matchers-2.0.0 spec/support/model_builder.rb
shoulda-matchers-1.5.6 spec/support/model_builder.rb
shoulda-matchers-1.5.5 spec/support/model_builder.rb
shoulda-matchers-1.5.4 spec/support/model_builder.rb
shoulda-matchers-1.5.2 spec/support/model_builder.rb
shoulda-matchers-1.5.1 spec/support/model_builder.rb