lib/data_miner/configuration.rb in data_miner-0.4.17 vs lib/data_miner/configuration.rb in data_miner-0.4.18

- old
+ new

@@ -1,72 +1,77 @@ module DataMiner class Configuration include Blockenspiel::DSL - attr_accessor :resource, :runnables, :runnable_counter, :attributes + attr_accessor :resource, :steps, :step_counter, :attributes def initialize(resource) - @runnables = Array.new + @steps = Array.new @resource = resource - @runnable_counter = 0 + @step_counter = 0 @attributes = HashWithIndifferentAccess.new end def process(method_name_or_block_description, &block) - runnables << DataMiner::Process.new(self, runnable_counter, method_name_or_block_description, &block) - self.runnable_counter += 1 + steps << DataMiner::Process.new(self, step_counter, method_name_or_block_description, &block) + self.step_counter += 1 end def clone(description, options = {}) - runnables << DataMiner::Clone.new(self, runnable_counter, description, options) - self.runnable_counter += 1 + steps << DataMiner::Clone.new(self, step_counter, description, options) + self.step_counter += 1 end def import(*args, &block) if args.length == 1 description = '(no description)' else description = args.first end options = args.last - runnable = DataMiner::Import.new self, runnable_counter, description, options - Blockenspiel.invoke block, runnable - runnables << runnable - self.runnable_counter += 1 + step = DataMiner::Import.new self, step_counter, description, options + Blockenspiel.invoke block, step + steps << step + self.step_counter += 1 end # Mine data for this class. def run(options = {}) options.symbolize_keys! + return if DataMiner::Configuration.call_stack.include? resource.name + DataMiner::Configuration.call_stack.push resource.name + finished = false if DataMiner::Run.table_exists? run = DataMiner::Run.create! :started_at => Time.now, :resource_name => resource.name if DataMiner::Run.table_exists? else run = nil DataMiner.log_info "Not logging individual runs. Please run DataMiner::Run.create_tables if you want to enable this." end resource.delete_all if options[:from_scratch] begin - runnables.each { |runnable| runnable.run run } + steps.each { |step| step.run run } finished = true ensure run.update_attributes! :ended_at => Time.now, :finished => finished if DataMiner::Run.table_exists? + DataMiner::Configuration.call_stack.clear if DataMiner::Configuration.call_stack.first == resource.name end nil end - def import_runnables - runnables.select { |runnable| runnable.is_a? Import } + def import_steps + steps.select { |step| step.is_a? Import } end def before_invoke end def after_invoke + return unless resource.table_exists? make_sure_unit_definitions_make_sense suggest_missing_column_migrations end COMPLETE_UNIT_DEFINITIONS = [ @@ -77,12 +82,12 @@ [:units_field_number], [:units_field_number, :to_units] ] def make_sure_unit_definitions_make_sense - import_runnables.each do |runnable| - runnable.attributes.each do |_, attribute| + import_steps.each do |step| + step.attributes.each do |_, attribute| if attribute.options.any? { |k, _| k.to_s =~ /unit/ } and COMPLETE_UNIT_DEFINITIONS.none? { |complete_definition| complete_definition.all? { |required_option| attribute.options[required_option].present? } } DataMiner.log_or_raise %{ ================================ @@ -109,12 +114,12 @@ unless resource.column_names.include?('data_miner_last_run_id') non_essential_missing_columns << 'data_miner_last_run_id' DataMiner.log_info "Not recording which run touched a row." end - import_runnables.each do |runnable| - runnable.attributes.each do |_, attribute| + import_steps.each do |step| + step.attributes.each do |_, attribute| DataMiner.log_or_raise "You can't have an attribute column that ends in _units (reserved): #{resource.table_name}.#{attribute.name}" if attribute.name.ends_with? '_units' unless resource.column_names.include? attribute.name missing_columns << attribute.name end if attribute.wants_units? and !resource.column_names.include?(units_column = "#{attribute.name}_units") @@ -158,9 +163,12 @@ end end cattr_accessor :resource_names self.resource_names = Array.new + + cattr_accessor :call_stack + self.call_stack = Array.new class << self # Mine data. Defaults to all resource_names touched by DataMiner. # # Options # * <tt>:resource_names</tt>: array of resource (class) names to mine