2009-06-30 22:50:18 +02:00

85 lines
2.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import shutil
import sys
from pkg_resources import resource_filename
from migrate.versioning.base import *
from migrate.versioning import pathed
class Packaged(pathed.Pathed):
"""An object assoc'ed with a Python package"""
def __init__(self, pkg):
self.pkg = pkg
path = self._find_path(pkg)
super(Packaged, self).__init__(path)
@classmethod
def _find_path(cls, pkg):
pkg_name, resource_name = pkg.rsplit('.', 1)
ret = resource_filename(pkg_name, resource_name)
return ret
class Collection(Packaged):
"""A collection of templates of a specific type"""
_default = None
def get_path(self, file):
return os.path.join(self.path, str(file))
def get_pkg(self, file):
return (self.pkg, str(file))
class RepositoryCollection(Collection):
_default = 'default'
class ScriptCollection(Collection):
_default = 'default.py_tmpl'
class Template(Packaged):
"""Finds the paths/packages of various Migrate templates"""
_repository = 'repository'
_script = 'script'
_manage = 'manage.py_tmpl'
def __init__(self, pkg):
super(Template, self).__init__(pkg)
self.repository = RepositoryCollection('.'.join((self.pkg,
self._repository)))
self.script = ScriptCollection('.'.join((self.pkg, self._script)))
def get_item(self, attr, filename=None, as_pkg=None, as_str=None):
item = getattr(self, attr)
if filename is None:
filename = getattr(item, '_default')
if as_pkg:
ret = item.get_pkg(filename)
if as_str:
ret = '.'.join(ret)
else:
ret = item.get_path(filename)
return ret
def get_repository(self, filename=None, as_pkg=None, as_str=None):
return self.get_item('repository', filename, as_pkg, as_str)
def get_script(self, filename=None, as_pkg=None, as_str=None):
return self.get_item('script', filename, as_pkg, as_str)
def manage(self, **k):
return (self.pkg, self._manage)
template_pkg = 'migrate.versioning.templates'
template = Template(template_pkg)