lib/kangaru/database.rb



module Kangaru
  class Database
    extend Forwardable

    include Attributable

    PLUGINS = %i[
      enum
      timestamps
    ].freeze

    attr_accessor :adaptor, :path, :migration_path

    attr_reader :handler

    def setup!
      raise "adaptor can't be blank" if adaptor.nil?

      @handler = case adaptor
                 when :sqlite then setup_sqlite!
                 else raise "invalid adaptor '#{adaptor}'"
                 end
    end

    def migrate!
      return unless handler
      return unless migrations_exist?

      Sequel.extension(:migration)

      Sequel::Migrator.run(handler, migration_path)
    end

    def_delegators :handler, :rollback_on_exit, :tables, :transaction

    private

    def migrations_exist?
      return false if migration_path.nil?

      Dir.exist?(migration_path) && !Dir.empty?(migration_path)
    end

    def setup_sqlite!
      raise "path can't be blank" if path.nil?

      FileUtils.mkdir_p(File.dirname(path))

      Sequel.sqlite(path).tap do
        PLUGINS.each { |plugin| Sequel::Model.plugin(plugin) }
      end
    end
  end
end