133 lines
4.3 KiB
Python
133 lines
4.3 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2014, Craig Tracey <craigtracey@gmail.com>
|
|
# All Rights Reserved.
|
|
#
|
|
# 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
|
|
|
|
import urlparse
|
|
|
|
from jinja2 import Environment
|
|
|
|
DEFAULT_GITREF = 'master'
|
|
DEFAULT_GITURL = {
|
|
'openstack': 'https://git.openstack.org/openstack/',
|
|
'stackforge': 'https://github.com/stackforge/'
|
|
}
|
|
DEFAULT_VENV_COMMAND = "virtualenv --no-wheel ."
|
|
DEFAULT_INSTALL_COMMAND = "./bin/pip install %s" # noqa
|
|
|
|
TEMPLATE_VARS = ('name', 'version', 'gitref', 'stackforge')
|
|
|
|
|
|
class OpenstackProject(object):
|
|
|
|
def __init__(self, settings, name, version=None, gitref=None, giturl=None,
|
|
gitdepth=1, venv_command=None, install_command=None,
|
|
install_path=None, package_name=None, stackforge=False,
|
|
system_dependencies=[], pip_dependencies=[],
|
|
postinstall_dependencies=[]):
|
|
self._settings = settings
|
|
self.name = name
|
|
self._version = version
|
|
self._gitref = gitref
|
|
self._giturl = giturl
|
|
self.gitdepth = gitdepth
|
|
self._venv_command = venv_command
|
|
self._install_command = install_command
|
|
self._install_path = install_path
|
|
self._package_name = package_name
|
|
self.stackforge = stackforge
|
|
self._git_path = None
|
|
self.system_dependencies = system_dependencies
|
|
self.pip_dependencies = pip_dependencies
|
|
self.postinstall_dependencies = postinstall_dependencies
|
|
|
|
@property
|
|
def version(self):
|
|
if not self._version:
|
|
self._version = self._settings.version
|
|
return self._version
|
|
|
|
@property
|
|
def gitref(self):
|
|
if not self._gitref:
|
|
self._gitref = DEFAULT_GITREF
|
|
return self._gitref
|
|
|
|
@property
|
|
def giturl(self):
|
|
if not self._giturl:
|
|
key = 'openstack'
|
|
if self.stackforge:
|
|
key = 'stackforge'
|
|
self._giturl = urlparse.urljoin(DEFAULT_GITURL[key], self.name)
|
|
return self._giturl
|
|
|
|
@property
|
|
def venv_command(self):
|
|
if not self._venv_command:
|
|
self._venv_command = DEFAULT_VENV_COMMAND
|
|
return self._venv_command
|
|
|
|
@property
|
|
def package_name(self):
|
|
if not self._package_name:
|
|
self._package_name = \
|
|
self._render_from_settings('package_name_format')
|
|
return self._package_name
|
|
|
|
def _template_vars(self):
|
|
template_vars = {'project': self}
|
|
template_vars['settings'] = self._settings
|
|
for var in TEMPLATE_VARS:
|
|
template_vars[var] = object.__getattribute__(self, var)
|
|
return template_vars
|
|
|
|
@property
|
|
def install_path(self):
|
|
if not self._install_path:
|
|
self._install_path = self._render_from_settings('install_path')
|
|
return self._install_path
|
|
|
|
@property
|
|
def install_command(self):
|
|
if not self._install_command:
|
|
self._install_command = DEFAULT_INSTALL_COMMAND
|
|
return self._install_command
|
|
|
|
@property
|
|
def git_path(self):
|
|
if not self._git_path:
|
|
gitorg = 'openstack'
|
|
if self.stackforge:
|
|
gitorg = 'stackforge'
|
|
self._git_path = '%s/%s' % (gitorg, self.name)
|
|
return self._git_path
|
|
|
|
def _render_from_settings(self, setting_name):
|
|
setting = getattr(self._settings, setting_name)
|
|
env = Environment()
|
|
env.add_extension('jinja2.ext.autoescape')
|
|
result = setting
|
|
while True:
|
|
t = env.from_string(result)
|
|
newresult = t.render(self._template_vars())
|
|
if newresult == result:
|
|
break
|
|
result = newresult
|
|
return result
|
|
|
|
@staticmethod
|
|
def factory(settings, project_dict, version):
|
|
return OpenstackProject(settings, version=version, **project_dict)
|