Skip to content

Commit

Permalink
Move DefineConstant code into macro
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuaclayton committed Aug 19, 2011
1 parent 7c9254a commit 0b2c4da
Show file tree
Hide file tree
Showing 25 changed files with 88 additions and 107 deletions.
11 changes: 0 additions & 11 deletions spec/acceptance/acceptance_helper.rb

This file was deleted.

1 change: 0 additions & 1 deletion spec/acceptance/attribute_aliases_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "attribute aliases" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/attributes_for_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "a generated attributes hash" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/attributes_ordered_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "a generated attributes hash where order matters" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/build_list_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "build multiple instances" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/build_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "a built instance" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/build_stubbed_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "a generated stub instance" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/callbacks_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "callbacks" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/create_list_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "create multiple instances" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/create_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "a created instance" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/default_strategy_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "default strategy" do
it "uses create when not specified" do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/definition_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "an instance generated by a factory with a custom class name" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/definition_without_block_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "an instance generated by a factory" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/overrides_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'
require 'active_support/ordered_hash'

describe "attribute overrides" do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/parent_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "an instance generated by a factory that inherits from another factory" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/sequence_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "sequences" do
include FactoryGirl::Syntax::Methods
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/syntax/blueprint_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

require 'factory_girl/syntax/blueprint'

Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/syntax/generate_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

require 'factory_girl/syntax/generate'

Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/syntax/make_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

require 'factory_girl/syntax/make'

Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/syntax/sham_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

require 'factory_girl/syntax/sham'

Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/syntax/vintage_spec.rb
@@ -1,5 +1,4 @@
require 'spec_helper'
require 'acceptance/acceptance_helper'

describe "vintage syntax" do
before do
Expand Down
1 change: 0 additions & 1 deletion spec/acceptance/traits_spec.rb
@@ -1,5 +1,4 @@
require "spec_helper"
require "acceptance/acceptance_helper"

describe "an instance generated by a factory with multiple traits" do
before do
Expand Down
8 changes: 0 additions & 8 deletions spec/factory_girl/factory_spec.rb
@@ -1,8 +1,6 @@
require 'spec_helper'

describe FactoryGirl::Factory do
include DefinesConstants

before do
@name = :user
@class = define_class('User')
Expand Down Expand Up @@ -220,8 +218,6 @@
end

describe FactoryGirl::Factory, "with a name ending in s" do
include DefinesConstants

let(:name) { :business }
let(:business_class) { Business }

Expand All @@ -239,8 +235,6 @@
end

describe FactoryGirl::Factory, "for namespaced class" do
include DefinesConstants

let(:name) { :settings }
let(:settings_class) { Admin::Settings }

Expand All @@ -267,8 +261,6 @@
end

describe FactoryGirl::Factory do
include DefinesConstants

let(:factory_with_non_existant_strategy) do
FactoryGirl::Factory.new(:object, :default_strategy => :nonexistent) { }
end
Expand Down
69 changes: 2 additions & 67 deletions spec/spec_helper.rb
Expand Up @@ -9,6 +9,8 @@
require "mocha"
require "bourne"

Dir["spec/support/**/*.rb"].each { |f| require File.expand_path(f) }

RSpec.configure do |config|
config.mock_framework = :mocha

Expand All @@ -18,70 +20,3 @@
FactoryGirl.traits.clear
end
end

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

after do
@defined_constants.reverse.each do |path|
namespace, class_name = *constant_path(path)
namespace.send(:remove_const, class_name)
end
@defined_constants.clear

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

def define_class(path, base = Object, &block)
namespace, class_name = *constant_path(path)
klass = Class.new(base)
namespace.const_set(class_name, klass)
klass.class_eval(&block) if block_given?
@defined_constants << path
klass
end

def define_model(name, columns = {}, &block)
model = define_class(name, ActiveRecord::Base, &block)
create_table(model.table_name) do |table|
columns.each do |name, type|
table.column name, type
end
end
model
end

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

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

def constant_path(constant_name)
names = constant_name.split('::')
class_name = names.pop
namespace = names.inject(Object) { |result, name| result.const_get(name) }
[namespace, class_name]
end
end
end
end

86 changes: 86 additions & 0 deletions spec/support/macros/define_constant.rb
@@ -0,0 +1,86 @@
require 'active_record'

module DefineConstantMacros
def define_class(path, base = Object, &block)
namespace, class_name = *constant_path(path)
klass = Class.new(base)
namespace.const_set(class_name, klass)
klass.class_eval(&block) if block_given?
@defined_constants << path
klass
end

def define_model(name, columns = {}, &block)
model = define_class(name, ActiveRecord::Base, &block)
create_table(model.table_name) do |table|
columns.each do |name, type|
table.column name, type
end
end
model
end

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

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

def constant_path(constant_name)
names = constant_name.split('::')
class_name = names.pop
namespace = names.inject(Object) { |result, name| result.const_get(name) }
[namespace, class_name]
end

def default_constants
@defined_constants ||= []
@created_tables ||= []
end

def clear_generated_constants
@defined_constants.reverse.each do |path|
namespace, class_name = *constant_path(path)
namespace.send(:remove_const, class_name)
end

@defined_constants.clear
end

def clear_generated_tables
@created_tables.each do |table_name|
ActiveRecord::Base.
connection.
execute("DROP TABLE IF EXISTS #{table_name}")
end
@created_tables.clear
end
end

RSpec.configure do |config|
config.include DefineConstantMacros

config.before(:all) do
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => File.join(File.dirname(__FILE__), 'test.db')
)
end

config.before do
default_constants
end

config.after do
clear_generated_constants
clear_generated_tables
end
end

0 comments on commit 0b2c4da

Please sign in to comment.