Sha256: 11fa4dbe1a52abdf91467fd2ba1cc9e9e3c4e3824b1f25e9cb7552b1143bc167

Contents?: true

Size: 1.31 KB

Versions: 1

Compression:

Stored size: 1.31 KB

Contents

module PgObjects
  class Manager
    attr_reader :objects, :config, :log

    def initialize
      raise UnsupportedAdapterError if ActiveRecord::Base.connection.adapter_name != 'PostgreSQL'

      @objects = []
      @config = PgObjects.config
      @log = Logger.new(config.silent)
    end

    def load_files
      config.directories.each do |dir|
        Dir[File.join(dir, '**', "*.{#{config.extensions.join(',')}}")].each do |path|
          @objects << PgObjects::DbObject.new(path)
        end
      end

      self
    end

    def create_objects
      @objects.each { |obj| create_object obj }
    end

    private

    def create_object(obj)
      return if obj.status == :done
      raise CyclicDependencyError if obj.status == :processing

      obj.status = :processing

      create_dependencies(obj.dependencies)

      log.write("creating #{obj.name}")
      ActiveRecord::Base.connection.exec_query obj.sql_query

      obj.status = :done
    end

    def create_dependencies(dependencies)
      dependencies.each { |dep_name| create_object find_object(dep_name) }
    end

    def find_object(dep_name)
      result = @objects.select { |obj| obj.name == dep_name }

      raise AmbiguousDependencyError if result.size > 1
      raise DependencyNotExistError, dep_name if result.empty?

      result[0]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pg_objects-0.2.4 lib/pg_objects/manager.rb