text: # -*- coding: utf-8 -*-
  # Copyright 2014 Objectif Libre
  #
  #    Licensed under the Apache License, Version 2.0 (the "License"); you may
  #    not use this file except in compliance with the License. You may obtain
  #    a copy of the License at
  #
  #         http://www.apache.org/licenses/LICENSE-2.0
  #
  #    Unless required by applicable law or agreed to in writing, software
  #    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  #    License for the specific language governing permissions and limitations
  #    under the License.
  #
  # @author: Stéphane Albert
  #
  import os
  
  import alembic
  from alembic import config as alembic_config
  
  ALEMBIC_INI_PATH = os.path.join(os.path.dirname(__file__), 'alembic.ini')
  
  
  def load_alembic_config(repo_path, ini_path=ALEMBIC_INI_PATH):
      if not os.path.exists(repo_path):
          raise Exception('Repo path (%s) not found.' % repo_path)
      if not os.path.exists(ini_path):
          raise Exception('Ini path (%s) not found.' % ini_path)
      config = alembic_config.Config(ini_path)
      config.set_main_option('script_location', repo_path)
      return config
  
  
  def upgrade(config, version):
      return alembic.command.upgrade(config, version or 'head')
  
  
  def downgrade(config, version):
      if isinstance(version, int) or version is None or version.isdigit():
          version = 'base'
      return alembic.command.downgrade(config, version)
  
  
  def version(config):
      return alembic.command.current(config)
  
  
  def revision(config, message='', autogenerate=False):
      """Creates template for migration.
  
      :param message: Text that will be used for migration title
      :type message: string
      :param autogenerate: If True - generates diff based on current database
                              state
      :type autogenerate: bool
      """
      return alembic.command.revision(config, message=message,
                                      autogenerate=autogenerate)
  
  
  def stamp(config, revision):
      """Stamps database with provided revision.
  
      :param revision: Should match one from repository or head - to stamp
                          database with most recent revision
      :type revision: string
      """
      return alembic.command.stamp(config, revision=revision)
  