diff options
author | Vincent Untz <vuntz@gnome.org> | 2010-04-18 14:22:47 -0700 |
---|---|---|
committer | Vincent Untz <vuntz@gnome.org> | 2010-04-18 14:22:47 -0700 |
commit | 8aae9c5b1f2933d503e5973f50c39e3d7cf383fa (patch) | |
tree | c9d69e2ec0552645418e42b7014ca88397a2c168 | |
parent | d020617c2ad2a224bb4e48f9580bf39dc9555973 (diff) | |
download | glib-new-gsettings.tar.gz |
Remove GSettingsSchemaDir class and move gconf-only code to gconf parsernew-gsettings
-rwxr-xr-x | gio/gsettings-schema-convert | 222 |
1 files changed, 107 insertions, 115 deletions
diff --git a/gio/gsettings-schema-convert b/gio/gsettings-schema-convert index 7c9bfdc0d..ff1127c81 100755 --- a/gio/gsettings-schema-convert +++ b/gio/gsettings-schema-convert @@ -85,12 +85,8 @@ class GSettingsSchemaConvertException(Exception): class GSettingsSchemaRoot: def __init__(self): - self.schemas = [] self.gettext_domain = None - - def simplify(self): - for schema in self.schemas: - schema.simplify() + self.schemas = [] def get_simple_string(self): need_empty_line = False @@ -122,28 +118,53 @@ class GSettingsSchemaRoot: ###################################### -# Note: defined before GSettingsSchema because GSettingsSchema is a subclass. -# But from a schema point of view, GSettingsSchema is a parent of -# GSettingsSchemaDir. -class GSettingsSchemaDir: +class GSettingsSchema: def __init__(self): + self.id = None + self.path = None + # only set when this schema is a child self.name = None + self.gettext_domain = None - self.dirs = [] + self.children = [] self.keys = [] - def get_simple_string(self, current_indent): + def get_simple_string(self, current_indent = '', parent_path = ''): + if not self.children and not self.keys: + return '' + content = self._get_simple_string_for_content(current_indent) if not content: return '' + if self.name: + id = 'child %s' % self.name + force_empty_line = False + else: + id = 'schema %s' % self.id + force_empty_line = True + + result = '' + result += '%s%s:\n' % (current_indent, id) + result += self._get_simple_string_for_attributes(current_indent, parent_path, force_empty_line) + result += content + + return result + + def _get_simple_string_for_attributes(self, current_indent, parent_path, force_empty_line): + need_empty_line = force_empty_line result = '' - result += '%schild %s:\n' % (current_indent, self.name) + if self.gettext_domain: result += '%sgettext-domain: %s\n' % (current_indent + GSETTINGS_SIMPLE_SCHEMA_INDENT, self.gettext_domain) + need_empty_line = True + if self.path and (not parent_path or (self.path != '%s%s/' % (parent_path, self.name))): + result += '%spath: %s\n' % (current_indent + GSETTINGS_SIMPLE_SCHEMA_INDENT, self.path) + need_empty_line = True + if need_empty_line: result += '\n' - result += content + return result def _get_simple_string_for_content(self, current_indent): @@ -154,35 +175,37 @@ class GSettingsSchemaDir: result += key.get_simple_string(current_indent + GSETTINGS_SIMPLE_SCHEMA_INDENT) need_empty_line = True - for dir in self.dirs: + for child in self.children: if need_empty_line: result += '\n' - result += dir.get_simple_string(current_indent + GSETTINGS_SIMPLE_SCHEMA_INDENT) + result += child.get_simple_string(current_indent + GSETTINGS_SIMPLE_SCHEMA_INDENT, self.path) if result: need_empty_line = True return result - def get_xml_nodes(self, parent_id, parent_path): - id = '%s.%s' % (parent_id, self.name) - path = '%s%s/' % (parent_path, self.name) + def get_xml_nodes(self): + if not self.children and not self.keys: + return [] - (node, children) = self._get_xml_nodes_for_content(id, path) + (node, children_nodes) = self._get_xml_nodes_for_content() if node is None: return [] - node.set('id', id) - node.set('path', path) + node.set('id', self.id) + if self.path: + node.set('path', self.path) + nodes = [ node ] - nodes.extend(children) + nodes.extend(children_nodes) return nodes - def _get_xml_nodes_for_content(self, id, path): - if not self.keys and not self.dirs: + def _get_xml_nodes_for_content(self): + if not self.keys and not self.children: return (None, None) - children = [] + children_nodes = [] schema_node = ET.Element('schema') if self.gettext_domain: @@ -191,67 +214,16 @@ class GSettingsSchemaDir: for key in self.keys: key_node = key.get_xml_node() schema_node.append(key_node) - for dir in self.dirs: - dir_nodes = dir.get_xml_nodes(id, path) - children.extend(dir_nodes) + for child in self.children: + child_nodes = child.get_xml_nodes() + children_nodes.extend(child_nodes) child_node = ET.SubElement(schema_node, 'child') - child_node.set('name', dir.name) - child_node.set('schema', '%s.%s' % (id, dir.name)) - - return (schema_node, children) - - -###################################### - - -class GSettingsSchema(GSettingsSchemaDir): - - def __init__(self): - self.id = None - self.path = None - self.gettext_domain = None - self.dirs = [] - self.keys = [] - - def simplify(self): - while len(self.dirs) == 1 and not self.keys: - dir = self.dirs[0] - self.dirs = dir.dirs - self.keys = dir.keys - if self.path: - self.path += dir.name + '/' - - def get_simple_string(self): - if not self.dirs and not self.keys: - return '' - - result = '' - result += 'schema %s:\n' % self.id - if self.gettext_domain: - result += '%sgettext-domain: %s\n' % (GSETTINGS_SIMPLE_SCHEMA_INDENT, self.gettext_domain) - if self.path: - result += '%spath: %s\n' % (GSETTINGS_SIMPLE_SCHEMA_INDENT, self.path) - result += '\n' - result += self._get_simple_string_for_content('') - - return result - - def get_xml_nodes(self): - if not self.dirs and not self.keys: - return [] + if not child.name: + raise GSettingsSchemaConvertException('Internal error: child being processed with no schema id.') + child_node.set('name', child.name) + child_node.set('schema', '%s' % child.id) - (node, children) = self._get_xml_nodes_for_content(self.id, self.path or '') - if node is None: - return [] - - node.set('id', self.id) - if self.path: - node.set('path', self.path) - - nodes = [ node ] - nodes.extend(children) - - return nodes + return (schema_node, children_nodes) ###################################### @@ -594,10 +566,15 @@ class SimpleSchemaParser: elif self.current_token == 'path': current_object.path = self.unparsed_line elif self.current_token == 'child': + if not isinstance(current_object, GSettingsSchema): + raise GSettingsSchemaConvertException('Internal error: child being processed with no parent schema.') name = self._parse_id_without_separator() - new_object = GSettingsSchemaDir() + new_object = GSettingsSchema() + new_object.id = '%s.%s' % (current_object.id, name) + if current_object.path: + new_object.path = '%s%s/' % (current_object.path, name) new_object.name = name - current_object.dirs.append(new_object) + current_object.children.append(new_object) elif self.current_token == 'key': new_object = self._parse_key() current_object.keys.append(new_object) @@ -751,21 +728,13 @@ class XMLSchemaParser: for (child_schema, child_name) in parent_schema._children: if child_schema == schema.id: found = True - expected_path = parent_schema.path + child_name + '/' - if schema.path != expected_path: - raise GSettingsSchemaConvertException('\'%s\' is too complex for this tool: child \'%s\' of schema \'%s\' has a path that is not the expected one (\'%s\' vs \'%s\').' % (os.path.basename(self.file), child_name, parent_schema.id, schema.path, expected_path)) break if not found: raise GSettingsSchemaConvertException('Internal error: child not found in parent\'s children.') - schema_dir = GSettingsSchemaDir() - schema_dir.name = child_name - schema_dir.gettext_domain = schema.gettext_domain - schema_dir.dirs = schema.dirs - schema_dir.keys = schema.keys - - parent_schema.dirs.append(schema_dir) + schema.name = child_name + parent_schema.children.append(schema) else: self.root.schemas.append(schema) @@ -885,7 +854,7 @@ class GConfSchemaParser: self.default_schema_id_count = 0 def _insert_schema(self, gconf_schema): - schemas_only = (gconf_schema.applyto is not None) + schemas_only = (gconf_schema.applyto is None) dirpath = gconf_schema.prefix if dirpath[0] != '/': @@ -910,44 +879,67 @@ class GConfSchemaParser: gsettings_schema = None for schema in self.root.schemas: if schemas_only: - schema_path = schema.path - else: schema_path = schema._hacky_path + else: + schema_path = schema.path if dirpath.startswith(schema_path): gsettings_schema = schema break if not gsettings_schema: gsettings_schema = GSettingsSchema() - if self.default_schema_id: - gsettings_schema.id = self.default_schema_id - if self.default_schema_id_count > 0: - gsettings_schema.id += '.FIXME-%s' % self.default_schema_id_count - self.default_schema_id_count += 1 - else: - gsettings_schema.id = 'FIXME' if schemas_only: - gsettings_schema.path = '/' + hierarchy[0] + '/' - else: gsettings_schema._hacky_path = '/' + hierarchy[0] + '/' + else: + gsettings_schema.path = '/' + hierarchy[0] + '/' self.root.schemas.append(gsettings_schema) - # we create all the subdirs that lead to this key + # we create the schema hierarchy that leads to this key gsettings_dir = gsettings_schema for item in hierarchy[1:]: subdir = None - for dir in gsettings_dir.dirs: - if dir.name == item: - subdir = dir + for child in gsettings_dir.children: + if child.name == item: + subdir = child break if not subdir: - subdir = GSettingsSchemaDir() + subdir = GSettingsSchema() + # note: the id will be set later on + if gsettings_dir.path: + subdir.path = '%s%s/' % (gsettings_dir.path, item) subdir.name = item - gsettings_dir.dirs.append(subdir) + gsettings_dir.children.append(subdir) gsettings_dir = subdir # we have the final directory, so we can put the key there gsettings_dir.keys.append(gconf_schema.get_gsettings_schema_key()) + def _set_children_id(self, schema): + for child in schema.children: + child.id = '%s.%s' % (schema.id, child.name) + self._set_children_id(child) + + def _fix_hierarchy(self): + for schema in self.root.schemas: + # we created one schema per level, starting at the root level; + # however, we don't need to go that far and we can simplify the + # hierarchy + while len(schema.children) == 1 and not schema.keys: + child = schema.children[0] + schema.children = child.children + schema.keys = child.keys + if schema.path: + schema.path += child.name + '/' + + # now that we have a toplevel schema, set the id + if self.default_schema_id: + schema.id = self.default_schema_id + if self.default_schema_id_count > 0: + schema.id += '.FIXME-%s' % self.default_schema_id_count + self.default_schema_id_count += 1 + else: + schema.id = 'FIXME' + self._set_children_id(schema) + def parse(self): # reset the state of the parser self.root = GSettingsSchemaRoot() @@ -958,7 +950,7 @@ class GConfSchemaParser: for schema_node in schemalist_node.findall('schema'): self._insert_schema(GConfSchema(schema_node)) - self.root.simplify() + self._fix_hierarchy() return self.root |