import os, sys from . import inifile from . import objproxy from .. import preconfig config = objproxy.Proxy({}) paths = [] filenames = [] def init(appname=None): global paths, filenames paths = [] filenames = [] if appname != None: if os.name == 'posix': if 'HOME' in os.environ: paths.append(os.path.join(os.environ['HOME'], appname)) paths.append(os.path.join('/etc', appname)) filenames.extend([x % (appname) for x in ('%s.conf', '%s.ini', '%s.cfg', '%s.cnf')]) elif os.name == 'nt': if 'APPDATA' in os.environ: paths.append(os.path.join(os.environ['APPDATA'], appname)) if 'LOCALAPPDATA' in os.environ: paths.append(os.path.join(os.environ['LOCALAPPDATA'], appname)) filenames.extend([x % (appname) for x in ('%s.ini', '%s.conf', '%s.cfg', '%s.cnf')]) if os.name == 'posix': if 'HOME' in os.environ: paths.append(os.environ['HOME']) paths.append('/etc') try: paths.append(os.path.abspath(os.path.dirname(__file__))) except: pass if os.name == 'nt': if 'USERPROFILE' in os.environ: paths.append(os.environ['USERPROFILE']) if 'WINDIR' in os.environ: paths.append(os.environ['WINDIR']) if 'SYSTEMDRIVE' in os.environ: paths.append('%s\\' % (os.environ['SYSTEMDRIVE']),) try: paths.append(os.path.abspath(os.path.split(os.path.dirname(__file__))[0])) paths.append(os.path.abspath(os.path.dirname(sys.argv[0]))) except: pass if os.name == 'posix': filenames.extend(['settings.conf', 'settings.ini', 'settings.cfg', 'settings.cnf']) else: filenames.extend(['settings.ini', 'settings.conf', 'settings.cfg', 'settings.cnf']) load_config() def locate_config(paths, filenames): fd = None for p in paths: for f in filenames: fp = os.path.join(p, f) if os.path.exists(fp): try: fd = inifile.inifile(fp) except SystemExit: fd = None return fd def load_config(fname=None): global paths, filenames if fname != None: fp, fn = os.path.split(fname) else: fp, fn = None, None if fp: pp = [fp] else: pp = paths[:] if fn: ff = [fn] else: ff = filenames[:] fd = locate_config(pp, ff) if fd != None: config._setobj(fd) def save_config(original_name=True, make_path=True): if original_name: fp = config.fname else: saved = False for f in filenames: for p in paths: if make_path: try: os.makedirs(p) except OSError: pass if os.path.exists(p): fp = os.path.join(p, f) config.fname = fp try: config.write() except OSError: continue saved = True break if not saved: raise(OSError, "No writable path to save configuration") if preconfig.load_config: init(preconfig.appname)