1from future
import standard_library
2standard_library.install_aliases()
6from contextlib
import contextmanager
7from future.utils
import with_metaclass
12 Expand environment variables in string:
13 $HOME/bin -> /home/user/bin
16 m = re.search(
"(\${*(\w+)}*)", string)
19 (env_token, env_name) = m.groups()
20 assert env_name
in os.environ,
"Environment variable '%s' is not defined" % env_name
21 env_value = os.environ[env_name]
22 string = string.replace(env_token, env_value)
43 Singleton registry of all Configurations
45 recent_config_name =
None
50 return ConfigRegistry.loadpys(fh.read(), **kwargs)
54 string_unixlf = config_string.replace(
'\r',
'')
55 exec(string_unixlf, kwargs)
56 return ConfigRegistry.get_latest_config()
60 return ConfigRegistry[ConfigRegistry.recent_config_name]
70 assert base
in registry,
"no base configuration (%s) found in the registry" % base
71 config = registry[base].clone()
76 registry[name] = config
77 ConfigRegistry.recent_config_name = name
82 return [k
for k, v
in registry.items()]
86 return ConfigRegistry[name]
90 for k
in ConfigRegistry.keys():
91 ConfigRegistry.delitem(k)
96 dict class that can address its keys as fields, e.g.
101 super(AttrDict, self).
__init__(*args, **kwargs)
106 for k, v
in self.items():
107 if isinstance(v, AttrDict):
108 result[k] = v.clone()
116 super(Config, self).
__init__(*args, **kwargs)
118 def loads(self, buff):
119 rv = pickle.loads(buff)
126 for k, v
in self.items():
127 if isinstance(v, AttrDict):
128 result[k] = v.clone()
134 return pickle.dumps(self)
138 self.
loads(fh.read())
143 return fh.write(self.
dumps())
146 return "ShipGeoConfig:\n " +
"\n ".join([
"%s: %s" % (k, self[k].
__str__())
for k
in sorted(self.keys())
if not k.startswith(
"_")])
__init__(self, *args, **kwargs)
register_config(name=None, base=None)
loadpys(config_string, **kwargs)
loadpy(filename, **kwargs)
__init__(self, *args, **kwargs)
__call__(cls, *args, **kwargs)