diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2005-05-17 18:04:46 +0000 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2005-05-17 18:04:46 +0000 |
commit | c7f7cfd506f504f658088bc0c7ee9f487d8a3d3f (patch) | |
tree | 4c031f0154c212f14bf3754236369324a472b260 /lib/bb/data.py | |
parent | f07abf6a9cd413ef71db0023288f5868a9d83ec6 (diff) | |
download | bitbake-c7f7cfd506f504f658088bc0c7ee9f487d8a3d3f.tar.gz |
bitbake data module abstraction:
-bb.data is now a delegate to hookable Data implementation.
-bb.data.init() is the 'factory' method to create a instance
of a concrete implementation.
-Kill assumptions that bb.data.init() returns a {} (python dict)
-Add the old Dictionary Based Implementation as data_dict.py
Diffstat (limited to 'lib/bb/data.py')
-rw-r--r-- | lib/bb/data.py | 132 |
1 files changed, 54 insertions, 78 deletions
diff --git a/lib/bb/data.py b/lib/bb/data.py index 8f0f5dd6e..b7c28b26b 100644 --- a/lib/bb/data.py +++ b/lib/bb/data.py @@ -8,6 +8,7 @@ Functions for interacting with the data structure used by the BitBake build tools. Copyright (C) 2003, 2004 Chris Larson +Copyright (C) 2005 Holger Hans Peter Freyther This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -32,27 +33,22 @@ else: path = os.path.dirname(os.path.dirname(sys.argv[0])) sys.path.append(path) -from bb import note, debug +from bb import note, debug, data_dict + +_dict_type = data_dict.DataDict + def init(): - return {} + return _dict_type() -_data = init() +_data_dict = init() -def initVar(var, d = _data): +def initVar(var, d = _data_dict): """Non-destructive var init for data structure""" - if not var in d: - d[var] = {} - - if not "flags" in d[var]: - d[var]["flags"] = {} + d.initVar(var) -__setvar_regexp__ = {} -__setvar_regexp__["_append"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_append") -__setvar_regexp__["_prepend"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_prepend") -__setvar_regexp__["_delete"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_delete") -def setVar(var, value, d = _data): +def setVar(var, value, d = _data_dict): """Set a variable to a given value Example: @@ -60,27 +56,10 @@ def setVar(var, value, d = _data): >>> print getVar('TEST') testcontents """ - for v in ["_append", "_prepend", "_delete"]: - match = __setvar_regexp__[v].match(var) - if match: - base = match.group('base') - override = match.group('add') - l = getVarFlag(base, v, d) or [] - if override == 'delete': - if l.count([value, None]): - del l[l.index([value, None])] - l.append([value, override]) - setVarFlag(base, v, l, d) - return + d.setVar(var,value) - if not var in d: - initVar(var, d) - if getVarFlag(var, 'matchesenv', d): - delVarFlag(var, 'matchesenv', d) - setVarFlag(var, 'export', 1, d) - d[var]["content"] = value -def getVar(var, d = _data, exp = 0): +def getVar(var, d = _data_dict, exp = 0): """Gets the value of a variable Example: @@ -88,13 +67,9 @@ def getVar(var, d = _data, exp = 0): >>> print getVar('TEST') testcontents """ - if not var in d or not "content" in d[var]: - return None - if exp: - return expand(d[var]["content"], d, var) - return d[var]["content"] + return d.getVar(var,exp) -def delVar(var, d = _data): +def delVar(var, d = _data_dict): """Removes a variable from the data set Example: @@ -105,10 +80,9 @@ def delVar(var, d = _data): >>> print getVar('TEST') None """ - if var in d: - del d[var] + d.delVar(var) -def setVarFlag(var, flag, flagvalue, d = _data): +def setVarFlag(var, flag, flagvalue, d = _data_dict): """Set a flag for a given variable to a given value Example: @@ -116,12 +90,9 @@ def setVarFlag(var, flag, flagvalue, d = _data): >>> print getVarFlag('TEST', 'python') 1 """ -# print "d[%s][\"flags\"][%s] = %s" % (var, flag, flagvalue) - if not var in d: - initVar(var, d) - d[var]["flags"][flag] = flagvalue + d.setVarFlag(var,flag,flagvalue) -def getVarFlag(var, flag, d = _data): +def getVarFlag(var, flag, d = _data_dict): """Gets given flag from given var Example: @@ -129,11 +100,9 @@ def getVarFlag(var, flag, d = _data): >>> print getVarFlag('TEST', 'python') 1 """ - if var in d and "flags" in d[var] and flag in d[var]["flags"]: - return d[var]["flags"][flag] - return None + return d.getVarFlag(var,flag) -def delVarFlag(var, flag, d = _data): +def delVarFlag(var, flag, d = _data_dict): """Removes a given flag from the variable's flags Example: @@ -145,10 +114,9 @@ def delVarFlag(var, flag, d = _data): None """ - if var in d and "flags" in d[var] and flag in d[var]["flags"]: - del d[var]["flags"][flag] + d.delVarFlag(var,flag) -def setVarFlags(var, flags, d = _data): +def setVarFlags(var, flags, d = _data_dict): """Set the flags for a given variable Example: @@ -158,11 +126,9 @@ def setVarFlags(var, flags, d = _data): >>> print getVarFlag('TEST', 'test') blah """ - if not var in d: - initVar(var, d) - d[var]["flags"] = flags + d.setVarFlags(var,flags) -def getVarFlags(var, d = _data): +def getVarFlags(var, d = _data_dict): """Gets a variable's flags Example: @@ -170,11 +136,9 @@ def getVarFlags(var, d = _data): >>> print getVarFlags('TEST')['test'] blah """ - if var in d and "flags" in d[var]: - return d[var]["flags"] - return None + return d.getVarFlags(var) -def delVarFlags(var, d = _data): +def delVarFlags(var, d = _data_dict): """Removes a variable's flags Example: @@ -186,21 +150,33 @@ def delVarFlags(var, d = _data): None """ - if var in d and "flags" in d[var]: - del d[var]["flags"] + d.delVarFlags(var) + +def keys(d = _data_dict): + """Return a list of keys in d + + Example: + >>> d = init() + >>> setVar('TEST', 1, d) + >>> setVar('MOO' , 2, d) + >>> setVarFlag('TEST', 'test', 1, d) + >>> keys(d) + ['TEST', 'MOO'] + """ + return d.keys() -def getData(d = _data): +def getData(d = _data_dict): """Returns the data object used""" return d -def setData(newData, d = _data): +def setData(newData, d = _data_dict): """Sets the data object to the supplied value""" d = newData __expand_var_regexp__ = re.compile(r"\${[^{}]+}") __expand_python_regexp__ = re.compile(r"\${@.+?}") -def expand(s, d = _data, varname = None): +def expand(s, d = _data_dict, varname = None): """Variable expansion using the data store. Example: @@ -251,11 +227,11 @@ def expand(s, d = _data, varname = None): raise return s -def expandKeys(alterdata = _data, readdata = None): +def expandKeys(alterdata = _data_dict, readdata = None): if readdata == None: readdata = alterdata - for key in alterdata.keys(): + for key in keys(alterdata): ekey = expand(key, readdata) if key == ekey: continue @@ -274,7 +250,7 @@ def expandKeys(alterdata = _data, readdata = None): delVar(key, alterdata) -def expandData(alterdata = _data, readdata = None): +def expandData(alterdata = _data_dict, readdata = None): """For each variable in alterdata, expand it, and update the var contents. Replacements use data from readdata. @@ -290,7 +266,7 @@ def expandData(alterdata = _data, readdata = None): if readdata == None: readdata = alterdata - for key in alterdata.keys(): + for key in keys(alterdata): val = getVar(key, alterdata) if type(val) is not types.StringType: continue @@ -301,7 +277,7 @@ def expandData(alterdata = _data, readdata = None): import os -def inheritFromOS(d = _data): +def inheritFromOS(d = _data_dict): """Inherit variables from the environment.""" # fakeroot needs to be able to set these non_inherit_vars = [ "LD_LIBRARY_PATH", "LD_PRELOAD" ] @@ -315,7 +291,7 @@ def inheritFromOS(d = _data): import sys -def emit_var(var, o=sys.__stdout__, d = _data, all=False): +def emit_var(var, o=sys.__stdout__, d = _data_dict, all=False): """Emit a variable to be sourced by a shell.""" if getVarFlag(var, "python", d): return 0 @@ -365,10 +341,10 @@ def emit_var(var, o=sys.__stdout__, d = _data, all=False): return 1 -def emit_env(o=sys.__stdout__, d = _data, all=False): +def emit_env(o=sys.__stdout__, d = _data_dict, all=False): """Emits all items in the data store in a format such that it can be sourced by a shell.""" - env = d.keys() + env = keys(d) for e in env: if getVarFlag(e, "func", d): @@ -380,7 +356,7 @@ def emit_env(o=sys.__stdout__, d = _data, all=False): continue emit_var(e, o, d) and o.write('\n') -def update_data(d = _data): +def update_data(d = _data_dict): """Modifies the environment vars according to local overrides and commands. Examples: Appending to a variable: @@ -423,7 +399,7 @@ def update_data(d = _data): dodel = [] overrides = (getVar('OVERRIDES', d, 1) or "").split(':') or [] - def applyOverrides(var, d = _data): + def applyOverrides(var, d = _data_dict): if not overrides: debug(1, "OVERRIDES not defined, nothing to do") return @@ -434,7 +410,7 @@ def update_data(d = _data): name = var[:-l] d[name] = d[var] - for s in d.keys(): + for s in keys(d): applyOverrides(s, d) sval = getVar(s, d) or "" |