Class: FactoryDataPreloader::Preloader

Inherits:
Object
  • Object
show all
Defined in:
lib/factory_data_preloader/preloader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_type, model_class, proc, depends_on) ⇒ Preloader

Returns a new instance of Preloader.



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/factory_data_preloader/preloader.rb', line 31

def initialize(model_type, model_class, proc, depends_on)
  model_class ||= model_type.to_s.pluralize.classify.constantize

  @model_type, @model_class, @proc, @depends_on = model_type, model_class, proc, [depends_on].compact.flatten
  AllPreloaders.instance << self

  DataMethods.class_eval do
    define_method model_type do |key|
      FactoryData.send(:get_record, model_type, key)
    end
  end
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



29
30
31
# File 'lib/factory_data_preloader/preloader.rb', line 29

def data
  @data
end

#depends_onObject

Returns the value of attribute depends_on.



28
29
30
# File 'lib/factory_data_preloader/preloader.rb', line 28

def depends_on
  @depends_on
end

#model_classObject

Returns the value of attribute model_class.



28
29
30
# File 'lib/factory_data_preloader/preloader.rb', line 28

def model_class
  @model_class
end

#model_typeObject

Returns the value of attribute model_type.



28
29
30
# File 'lib/factory_data_preloader/preloader.rb', line 28

def model_type
  @model_type
end

#procObject

Returns the value of attribute proc.



28
29
30
# File 'lib/factory_data_preloader/preloader.rb', line 28

def proc
  @proc
end

Instance Method Details

#all_dependenciesObject



67
68
69
# File 'lib/factory_data_preloader/preloader.rb', line 67

def all_dependencies
  (self.dependencies + (self.dependencies.collect { |d| d.all_dependencies }).flatten).uniq
end

#delete_table_data!Object



56
57
58
59
60
61
# File 'lib/factory_data_preloader/preloader.rb', line 56

def delete_table_data!
  unless @table_data_deleted
    self.model_class.delete_all
    @table_data_deleted = true
  end
end

#dependenciesObject



63
64
65
# File 'lib/factory_data_preloader/preloader.rb', line 63

def dependencies
  self.depends_on.collect { |dependency| AllPreloaders.instance.from_symbol(dependency) }
end

#get_record(key) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/factory_data_preloader/preloader.rb', line 71

def get_record(key)
  unless self.preloaded?
    raise DefinedPreloaderNotRunError.new, "The :#{self.model_type} preloader has never been run.  Did you forget to add the 'preload_factory_data :#{self.model_type}' declaration to your test case?  You'll need this at the top of your test case class if you want to use the factory data defined by this preloader."
  end

  unless record_id_or_error = self.data[key]
    raise PreloadedRecordNotFound.new, "Could not find a preloaded record #{self.model_type} record for :#{key}.  Did you mispell :#{key}?"
  end

  if record_id_or_error.is_a?(Exception)
    raise ErrorWhilePreloadingRecord.new, "An error occurred while preloading #{self.model_type}(:#{key}): #{record_id_or_error.class.to_s}: #{record_id_or_error.message}\n\nBacktrace:\n\n    #{record_id_or_error.backtrace.join("\n    ")}\n"
  end

  self.model_class.find_by_id(record_id_or_error)
end

#preload!Object



44
45
46
47
48
49
50
# File 'lib/factory_data_preloader/preloader.rb', line 44

def preload!
  return if preloaded?
  @data = PreloadedDataHash.new(self)
  print "Preloading #{model_type}:"
  benchmark_measurement = Benchmark.measure { self.proc.try(:call, @data) }
  print "(#{format('%.3f', benchmark_measurement.real)} secs)\n"
end

#preloaded?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/factory_data_preloader/preloader.rb', line 52

def preloaded?
  !@data.nil?
end

#remove!Object



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/factory_data_preloader/preloader.rb', line 87

def remove!
  preloader = self
  DataMethods.class_eval do
    remove_method(preloader.model_type) if method_defined?(preloader.model_type)
  end

  if @data
    self.model_class.delete_all(:id => @data.record_ids)
    @data = nil
  end

  AllPreloaders.instance.delete(self)
end