gabynaiman/active_git

View on GitHub
lib/active_git/synchronizer.rb

Summary

Maintainability
A
35 mins
Test Coverage
module ActiveGit
  class Synchronizer

    def self.synchronize(*events)
      batch = self.new

      Array(events).flatten.each do |event|
        event.synchronize batch
      end

      batch.run
    end

    def run
      if bulk_inserts.any?
        define_job do
          bulk_inserts.each do |model, records|
            records.each_slice(ActiveGit.configuration.sync_batch_size) do |batch_records|
              ActiveGit.configuration.logger.debug "[ActiveGit] Inserting #{model.model_name} models"
              import_result = model.import batch_records, timestamps: false, validate: false
              raise SynchronizationError.new(import_result.failed_instances) unless import_result.failed_instances.empty?
            end
          end
        end
      end

      ::ActiveRecord::Base.transaction do
        jobs.each(&:call)
      end

      ActiveGit.add_all
    end

    def bulk_insert(data)
      bulk_inserts[data.class] << data
    end

    def define_job(&block)
      jobs << block
    end

    private

    def bulk_inserts
      @bulk_inserts ||= Hash.new{|h,k| h[k] = []}
    end

    def jobs
      @jobs ||= []
    end

  end

end