Skip to content

Commit

Permalink
moved setup logic into a builder clean room so the defines block can …
Browse files Browse the repository at this point in the history
…not be used for messing with the internals for AR
  • Loading branch information
joshk committed Sep 27, 2009
1 parent 124f474 commit d8b2ef2
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 25 deletions.
1 change: 1 addition & 0 deletions lib/completeness-fu.rb
@@ -1,4 +1,5 @@
require 'completeness-fu/active_record_additions'
require 'completeness-fu/scoring_builder'

module ActiveRecord
Base.class_eval do
Expand Down
31 changes: 6 additions & 25 deletions lib/completeness-fu/active_record_additions.rb
Expand Up @@ -17,12 +17,13 @@ def self.define_completeness_scoring(&checks_block)

self.send :extend, ClassMethods
self.send :include, InstanceMethods

self.completeness_checks ||= []
self.default_weighting ||= CompletenessFu.default_weightings
self.model_weightings ||= CompletenessFu.common_weightings

self.instance_eval(&checks_block)
checks_results = CompletenessFu::ScoringBuilder.generate(self, &checks_block)

self.default_weighting = checks_results[:default_weighting]
self.completeness_checks = checks_results[:completeness_checks]
self.model_weightings = checks_results[:model_weightings]
self.before_validation checks_results[:cache_score_details] if checks_results[:cache_score_details]
end
end
end
Expand All @@ -32,26 +33,6 @@ module ClassMethods
def max_completeness_score
self.completeness_checks.inject(0) { |score, check| score += check[:weighting] }
end

private
def check(name, check, weighting = nil)
weighting ||= self.default_weighting
weighting = self.model_weightings[weighting] if weighting.is_a?(Symbol)
self.completeness_checks << { :name => name, :check => check, :weighting => weighting}
end

def weightings(custom_weighting_opts)
use_common = custom_weighting_opts.delete(:merge_with_common)
if use_common
self.model_weightings.merge!(custom_weights)
else
self.model_weightings = custom_weighting_opts
end
end

def cache_score(score_type = :relative)
before_validation lambda { |instance| instance.send :cache_completeness_score, score_type }
end
end


Expand Down
46 changes: 46 additions & 0 deletions lib/completeness-fu/scoring_builder.rb
@@ -0,0 +1,46 @@
module CompletenessFu

# A simple clean room for setting up the completeness check information
class ScoringBuilder

attr_accessor :completeness_checks, :model_weightings, :cache_score_details, :default_weighting

def self.generate(model, &block)
sb = ScoringBuilder.new

sb.completeness_checks = []
sb.default_weighting = CompletenessFu.default_weightings
sb.model_weightings = CompletenessFu.common_weightings

sb.instance_eval(&block)

{ :completeness_checks => sb.completeness_checks,
:model_weightings => sb.model_weightings,
:cache_score_details => sb.cache_score_details,
:default_weighting => sb.default_weighting }
end


private

def check(name, check, weighting = nil)
weighting ||= self.default_weighting
weighting = self.model_weightings[weighting] if weighting.is_a?(Symbol)
self.completeness_checks << { :name => name, :check => check, :weighting => weighting}
end

def weightings(custom_weighting_opts)
use_common = custom_weighting_opts.delete(:merge_with_common)
if use_common
self.model_weightings.merge!(custom_weights)
else
self.model_weightings = custom_weighting_opts
end
end

def cache_score(score_type = :relative)
self.cache_score_details = lambda { |instance| instance.send :cache_completeness_score, score_type }
end
end

end

0 comments on commit d8b2ef2

Please sign in to comment.