Use activesupport to remove code duplicating its behavior

Closes #206
This commit is contained in:
Joshua Clayton 2011-09-23 15:00:00 -04:00
parent 58e75bcb3f
commit 450dbb2c5c
7 changed files with 25 additions and 60 deletions

View File

@ -2,6 +2,7 @@ PATH
remote: .
specs:
factory_girl (2.1.1)
activesupport
GEM
remote: http://rubygems.org/
@ -28,31 +29,31 @@ GEM
cucumber (>= 1.0.2)
rdiscount (>= 1.6.8)
rspec (>= 2.6.0)
bcat (0.6.1)
bcat (0.6.2)
rack (~> 1.0)
bcrypt-ruby (3.0.0)
bcrypt-ruby (3.0.1)
bluecloth (2.1.0)
bourne (1.0)
mocha (= 0.9.8)
builder (3.0.0)
childprocess (0.2.2)
ffi (~> 1.0.6)
cucumber (1.0.2)
cucumber (1.0.6)
builder (>= 2.1.2)
diff-lcs (>= 1.1.2)
gherkin (~> 2.4.5)
gherkin (~> 2.4.18)
json (>= 1.4.6)
term-ansicolor (>= 1.0.5)
term-ansicolor (>= 1.0.6)
diff-lcs (1.1.3)
ffi (1.0.9)
gherkin (2.4.16)
gherkin (2.4.21)
json (>= 1.4.6)
i18n (0.6.0)
json (1.5.4)
json (1.6.1)
mocha (0.9.8)
rake
multi_json (1.0.3)
rack (1.3.2)
rack (1.3.3)
rake (0.9.2)
rcov (0.9.10)
rdiscount (1.6.8)

View File

@ -20,6 +20,8 @@ Gem::Specification.new do |s|
s.email = %q{jferris@thoughtbot.com}
s.homepage = "https://github.com/thoughtbot/factory_girl"
s.add_dependency("activesupport")
s.add_development_dependency("rspec", "~> 2.0")
s.add_development_dependency("cucumber", "~> 1.0.0")
s.add_development_dependency("timecop")

View File

@ -2,6 +2,7 @@ PATH
remote: /Users/joshuaclayton/dev/gems/factory_girl
specs:
factory_girl (2.1.1)
activesupport
GEM
remote: http://rubygems.org/

View File

@ -2,6 +2,7 @@ PATH
remote: /Users/joshuaclayton/dev/gems/factory_girl
specs:
factory_girl (2.1.1)
activesupport
GEM
remote: http://rubygems.org/

View File

@ -2,6 +2,7 @@ PATH
remote: /Users/joshuaclayton/dev/gems/factory_girl
specs:
factory_girl (2.1.1)
activesupport
GEM
remote: http://rubygems.org/

View File

@ -2,6 +2,7 @@ PATH
remote: /Users/joshuaclayton/dev/gems/factory_girl
specs:
factory_girl (2.1.1)
activesupport
GEM
remote: http://rubygems.org/

View File

@ -1,3 +1,6 @@
require "active_support/core_ext/hash/keys"
require "active_support/inflector"
module FactoryGirl
# Raised when a factory is defined that attempts to instantiate itself.
class AssociationDefinitionError < RuntimeError
@ -24,7 +27,7 @@ module FactoryGirl
end
def build_class #:nodoc:
@build_class ||= class_for(class_name)
@build_class ||= class_name.to_s.camelize.constantize
end
def default_strategy #:nodoc:
@ -33,7 +36,7 @@ module FactoryGirl
def initialize(name, options = {}) #:nodoc:
assert_valid_options(options)
@name = factory_name_for(name)
@name = name.to_s.underscore.to_sym
@parent = options[:parent]
@parent_factory = nil
@options = options
@ -94,7 +97,7 @@ module FactoryGirl
def run(proxy_class, overrides) #:nodoc:
proxy = proxy_class.new(build_class)
callbacks.each { |callback| proxy.add_callback(callback) }
overrides = symbolize_keys(overrides)
overrides = overrides.symbolize_keys
attributes.each do |attribute|
factory_overrides = overrides.select { |attr, val| attribute.aliases_for?(attr) }
@ -109,7 +112,7 @@ module FactoryGirl
end
def human_names
names.map {|name| name.to_s.gsub('_', ' ') }
names.map {|name| name.to_s.humanize.downcase }
end
def associations
@ -195,30 +198,9 @@ module FactoryGirl
update_children if allow_overrides?
end
def class_for (class_or_to_s)
if class_or_to_s.respond_to?(:to_sym)
class_name = variable_name_to_class_name(class_or_to_s)
class_name.split('::').inject(Object) do |object, string|
object.const_get(string)
end
else
class_or_to_s
end
end
def factory_name_for(class_or_to_s)
if class_or_to_s.respond_to?(:to_sym)
class_or_to_s.to_sym
else
class_name_to_variable_name(class_or_to_s).to_sym
end
end
def assert_valid_options(options)
invalid_keys = options.keys - [:class, :parent, :default_strategy, :aliases, :traits]
unless invalid_keys == []
raise ArgumentError, "Unknown arguments: #{invalid_keys.inspect}"
end
options.assert_valid_keys(:class, :parent, :default_strategy, :aliases, :traits)
if options[:default_strategy]
assert_valid_strategy(options[:default_strategy])
puts "WARNING: default_strategy is deprecated."
@ -227,35 +209,11 @@ module FactoryGirl
end
def assert_valid_strategy(strategy)
unless Proxy.const_defined? variable_name_to_class_name(strategy)
unless Proxy.const_defined? strategy.to_s.camelize
raise ArgumentError, "Unknown strategy: #{strategy}"
end
end
# Based on ActiveSupport's underscore inflector
def class_name_to_variable_name(name)
name.to_s.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
# Based on ActiveSupport's camelize inflector
def variable_name_to_class_name(name)
name.to_s.
gsub(/\/(.?)/) { "::#{$1.upcase}" }.
gsub(/(?:^|_)(.)/) { $1.upcase }
end
# From ActiveSupport
def symbolize_keys(hash)
hash.inject({}) do |options, (key, value)|
options[(key.to_sym rescue key) || key] = value
options
end
end
def trait_for(name)
@defined_traits.detect {|trait| trait.name == name }
end