class DataSanity::Inspector
Constants
- ALLOWED_VALIDATION
- CONSIDERED_RECORDS
Attributes
all[RW]
criteria[RW]
models[RW]
output[RW]
random[RW]
records_per_model[RW]
Public Class Methods
new(options = {})
click to toggle source
# File lib/data_sanity/inspector.rb, line 8 def initialize options = {} @output = DataSanity::Output.new :option => ( options[:strategy] || :table ).to_sym options[:validate] == "random" ? @random = true : @all = true @records_per_model = options[:records_per_model].to_i == 0 ? CONSIDERED_RECORDS : options[:records_per_model].to_i @models = load_models file_path = "#{Rails.root}/config/data_sanity_criteria.yml" @criteria = (File.exists?(file_path) ? (YAML.load File.open(file_path).read) : false) rescue false end
Public Instance Methods
investigate()
click to toggle source
# File lib/data_sanity/inspector.rb, line 17 def investigate if @all considered_models = @criteria ? @criteria.keys : @models considered_models.each do |model_string| model = model_string.constantize @output.start_log model validate_all(model) @output.end_log end elsif @criteria @criteria.keys.each do |model| @output.start_log model validate_criteria(model.constantize, @criteria[model]) @output.end_log end else @models.each do |model_string| @output.start_log model_string validate_random(model_string.constantize) @output.end_log end end @output.close end
Private Instance Methods
load_models()
click to toggle source
# File lib/data_sanity/inspector.rb, line 81 def load_models Dir["#{Rails.root}/app/models/**/*.rb"].each { |file_path| require file_path rescue nil } all_models = ActiveRecord::Base.descendants.select(&:descends_from_active_record?).collect(&:name) all_models.delete("DataInspector") all_models end
populate_if_invalid_record(instance, model)
click to toggle source
# File lib/data_sanity/inspector.rb, line 75 def populate_if_invalid_record(instance, model) @output.create_from model, instance unless instance.valid? rescue Exception => exp @output.create_from model, instance, exp end
validate_all(model)
click to toggle source
# File lib/data_sanity/inspector.rb, line 44 def validate_all(model) model.find_each do |instance| populate_if_invalid_record(instance, model) end end
validate_criteria(model, criteria)
click to toggle source
# File lib/data_sanity/inspector.rb, line 59 def validate_criteria(model, criteria) validate_random(model) and return if criteria.blank? criteria.each do |attribute, values| values = (model.select("DISTINCT(#{attribute})").collect(&attribute.to_sym)) if values.blank? values.each do |value| results = model.where(attribute.to_sym => value) count = results.count next if count == 0 [@records_per_model, count].min.times do instance = results.offset(rand(count)).first populate_if_invalid_record(instance, model) end end end end
validate_random(model)
click to toggle source
# File lib/data_sanity/inspector.rb, line 50 def validate_random(model) no_of_records = model.count return if no_of_records == 0 [@records_per_model, no_of_records].min.times do instance = model.offset(rand(no_of_records)).first populate_if_invalid_record(instance, model) end end