mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-04 17:49:45 +02:00
153 lines
3.7 KiB
Python
153 lines
3.7 KiB
Python
#! /usr/bin/env python
|
|
# encoding: utf-8
|
|
# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
|
|
|
|
import copy,re,os
|
|
from waflib import Logs,Utils
|
|
re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M)
|
|
class ConfigSet(object):
|
|
__slots__=('table','parent')
|
|
def __init__(self,filename=None):
|
|
self.table={}
|
|
if filename:
|
|
self.load(filename)
|
|
def __contains__(self,key):
|
|
if key in self.table:return True
|
|
try:return self.parent.__contains__(key)
|
|
except AttributeError:return False
|
|
def keys(self):
|
|
keys=set()
|
|
cur=self
|
|
while cur:
|
|
keys.update(cur.table.keys())
|
|
cur=getattr(cur,'parent',None)
|
|
keys=list(keys)
|
|
keys.sort()
|
|
return keys
|
|
def __str__(self):
|
|
return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in self.keys()])
|
|
def __getitem__(self,key):
|
|
try:
|
|
while 1:
|
|
x=self.table.get(key,None)
|
|
if not x is None:
|
|
return x
|
|
self=self.parent
|
|
except AttributeError:
|
|
return[]
|
|
def __setitem__(self,key,value):
|
|
self.table[key]=value
|
|
def __delitem__(self,key):
|
|
self[key]=[]
|
|
def __getattr__(self,name):
|
|
if name in self.__slots__:
|
|
return object.__getattr__(self,name)
|
|
else:
|
|
return self[name]
|
|
def __setattr__(self,name,value):
|
|
if name in self.__slots__:
|
|
object.__setattr__(self,name,value)
|
|
else:
|
|
self[name]=value
|
|
def __delattr__(self,name):
|
|
if name in self.__slots__:
|
|
object.__delattr__(self,name)
|
|
else:
|
|
del self[name]
|
|
def derive(self):
|
|
newenv=ConfigSet()
|
|
newenv.parent=self
|
|
return newenv
|
|
def detach(self):
|
|
tbl=self.get_merged_dict()
|
|
try:
|
|
delattr(self,'parent')
|
|
except AttributeError:
|
|
pass
|
|
else:
|
|
keys=tbl.keys()
|
|
for x in keys:
|
|
tbl[x]=copy.deepcopy(tbl[x])
|
|
self.table=tbl
|
|
def get_flat(self,key):
|
|
s=self[key]
|
|
if isinstance(s,str):return s
|
|
return' '.join(s)
|
|
def _get_list_value_for_modification(self,key):
|
|
try:
|
|
value=self.table[key]
|
|
except KeyError:
|
|
try:value=self.parent[key]
|
|
except AttributeError:value=[]
|
|
if isinstance(value,list):
|
|
value=value[:]
|
|
else:
|
|
value=[value]
|
|
else:
|
|
if not isinstance(value,list):
|
|
value=[value]
|
|
self.table[key]=value
|
|
return value
|
|
def append_value(self,var,val):
|
|
current_value=self._get_list_value_for_modification(var)
|
|
if isinstance(val,str):
|
|
val=[val]
|
|
current_value.extend(val)
|
|
def prepend_value(self,var,val):
|
|
if isinstance(val,str):
|
|
val=[val]
|
|
self.table[var]=val+self._get_list_value_for_modification(var)
|
|
def append_unique(self,var,val):
|
|
if isinstance(val,str):
|
|
val=[val]
|
|
current_value=self._get_list_value_for_modification(var)
|
|
for x in val:
|
|
if x not in current_value:
|
|
current_value.append(x)
|
|
def get_merged_dict(self):
|
|
table_list=[]
|
|
env=self
|
|
while 1:
|
|
table_list.insert(0,env.table)
|
|
try:env=env.parent
|
|
except AttributeError:break
|
|
merged_table={}
|
|
for table in table_list:
|
|
merged_table.update(table)
|
|
return merged_table
|
|
def store(self,filename):
|
|
try:
|
|
os.makedirs(os.path.split(filename)[0])
|
|
except OSError:
|
|
pass
|
|
buf=[]
|
|
merged_table=self.get_merged_dict()
|
|
keys=list(merged_table.keys())
|
|
keys.sort()
|
|
try:
|
|
fun=ascii
|
|
except NameError:
|
|
fun=repr
|
|
for k in keys:
|
|
if k!='undo_stack':
|
|
buf.append('%s = %s\n'%(k,fun(merged_table[k])))
|
|
Utils.writef(filename,''.join(buf))
|
|
def load(self,filename):
|
|
tbl=self.table
|
|
code=Utils.readf(filename,m='rU')
|
|
for m in re_imp.finditer(code):
|
|
g=m.group
|
|
tbl[g(2)]=eval(g(3))
|
|
Logs.debug('env: %s'%str(self.table))
|
|
def update(self,d):
|
|
for k,v in d.items():
|
|
self[k]=v
|
|
def stash(self):
|
|
orig=self.table
|
|
tbl=self.table=self.table.copy()
|
|
for x in tbl.keys():
|
|
tbl[x]=copy.deepcopy(tbl[x])
|
|
self.undo_stack=self.undo_stack+[orig]
|
|
def revert(self):
|
|
self.table=self.undo_stack.pop(-1)
|