########################################################################
# $Header: /var/local/cvsroot/4Suite/Ft/Lib/DistExt/InstallConfig.py,v 1.1 2006/08/12 15:56:24 jkloth Exp $
"""
distutils command for installing the configuration file.
Copyright 2006 Fourthought, Inc. (USA).
Detailed license and copyright information: http://4suite.org/COPYRIGHT
Project home, documentation, distributions: http://4suite.org/
"""
import os
from distutils.core import Command
from distutils.util import convert_path,subst_vars
from Ft.Lib.DistExt import Install
METADATA_KEYS = ('name', 'version', 'fullname', 'url')
CONFIG_KEYS = ('resourcebundle', 'pythonlibdir', 'bindir', 'datadir',
'sysconfdir', 'localstatedir', 'libdir', 'localedir')
CONFIG_MAPPING = {
'pythonlibdir' : 'lib',
'bindir' : 'scripts',
'datadir' : 'data',
'sysconfdir' : 'sysconf',
'localstatedir' : 'localstate',
'libdir' : 'devel',
'localedir' : 'l10n',
}
CONFIG_STUB = """# Configuration variables
%(metadata)s
import sys
if getattr(sys, 'frozen', False):
# "bundled" installation locations (e.g., py2exe, cx_Freeze)
%(bundle_config)s
else:
# standard distutils installation directories
%(install_config)s
del sys
"""
class InstallConfig(Command):
command_name = 'install_config'
description = "install configuration file"
user_options = [
('install-dir=', 'd', "directory to install to"),
]
def initialize_options(self):
self.install_dir = None
return
def finalize_options(self):
self.set_undefined_options('install_lib',
('install_dir', 'install_dir'))
if self.distribution.config_module:
parts = self.distribution.config_module.split('.')
basename = os.path.join(*parts) + '.py'
self.config_filename = os.path.join(self.install_dir, basename)
else:
self.config_filename = None
return
def run(self):
if not self.config_filename:
return
install = self.get_finalized_command('install')
prefix_len = len(install.root or '')
install_config = dict(install.config_vars)
install_config['resourcebundle'] = install.scheme == 'zip'
config_vars = CONFIG_MAPPING.values()
for var in config_vars:
command = 'install_' + var
install_dir = self.get_finalized_command(command).install_dir
if install_dir and prefix_len:
install_dir = install_dir[prefix_len:]
install_config[var] = install_dir
self.announce('writing %s' % self.config_filename, 2)
if not self.dry_run:
f = open(self.config_filename, 'w')
try:
self.write_config_module(f, install_config)
finally:
f.close()
return
def write_config_module(self, file, install_config):
"""
Write the configuration variables to a file object.
"""
maxlen = max(map(len, METADATA_KEYS))
lines = []
for name in METADATA_KEYS:
value = getattr(self.distribution, 'get_' + name)()
lines.append('%-*s = %r' % (maxlen, name.upper(), value))
metadata = '\n'.join(lines)
maxlen = max(map(len, CONFIG_KEYS))
lines = []
for name in CONFIG_KEYS:
value = install_config[CONFIG_MAPPING.get(name, name)]
lines.append('%-*s = %r' % (maxlen, name.upper(), value))
install_config = '\n '.join(lines)
lines = []
bundle_config = Install.GetBundleScheme()
bundle_config['resourcebundle'] = True
for name in CONFIG_KEYS:
value = bundle_config[CONFIG_MAPPING.get(name, name)]
lines.append('%-*s = %r' % (maxlen, name.upper(), value))
bundle_config = '\n '.join(lines)
file.write(CONFIG_STUB % {'metadata' : metadata,
'bundle_config' : bundle_config,
'install_config' : install_config,
})
return
# -- Reporting methods ---------------------------------------------
def get_source_files(self):
return []
def get_outputs(self):
if self.config_filename:
outputs = [self.config_filename]
else:
outputs = []
return outputs
|