], single_line=True) _INDEX_TYPE = models.ObjectNodeType('index', attributes=[ ('fields', unicode, None), ], single_line=True) _STATISTICS_TYPE = models.ObjectNodeType( 'statistics', attributes=[ ('export', unicode, r'^(?i)(|true|false)$'), ], children=[ models.ChildType('quantiles', _QUANTILES_TYPE, multiple=False), models.ChildType('enumeration', _ENUMERATION_TYPE, multiple=False), ]) _HISTORY_TYPE = models.ObjectNodeType('history', attributes=[], children=[ models.ChildType('index', _INDEX_TYPE, multiple=True), models.ChildType('statistics', _STATISTICS_TYPE, multiple=True), ]) _AGGREGATION_TYPE = models.ObjectNodeType('aggregation',
_SUMMARY_TYPE = models.TextNodeType('summary') _NOISE_VALUES_TYPE = models.ObjectNodeType('noise-values', float_attributes=[ 'fake-prob', 'fake-one-prob', 'one-coin-prob', 'zero-coin-prob', ]) _NOISE_LEVEL_TYPE = models.ObjectNodeType( 'noise-level', extra_newlines=(1, 1, 1), string_attributes=['name'], children=[ models.ChildType('summary', _SUMMARY_TYPE, False), models.ChildType('values', _NOISE_VALUES_TYPE, False), ]) _NOISE_LEVELS_TYPE = models.ObjectNodeType('noise-levels', extra_newlines=(1, 1, 1), dont_indent=True, children=[ models.ChildType( 'types', _NOISE_LEVEL_TYPE, True), ]) _PARAMETERS_TYPE = models.ObjectNodeType( 'parameters', int_attributes=[
_SUMMARY_TYPE = models.TextNodeType('summary') _METRIC_TYPE = models.ObjectNodeType('metric', attributes=[ ('name', unicode, r'^[A-Za-z0-9_.]+$'), ('kind', unicode, r'^(?i)(|hashed-string|int)$'), ], alphabetization=[ (_OBSOLETE_TYPE.tag, lambda _: 1), (_SUMMARY_TYPE.tag, lambda _: 2), ], children=[ models.ChildType(_OBSOLETE_TYPE.tag, _OBSOLETE_TYPE, multiple=False), models.ChildType(_OWNER_TYPE.tag, _OWNER_TYPE, multiple=True), models.ChildType(_SUMMARY_TYPE.tag, _SUMMARY_TYPE, multiple=False), ]) _EVENT_TYPE = models.ObjectNodeType( 'event', attributes=[ ('name', unicode, r'^[A-Z][A-Za-z0-9.]*$'), ('project', unicode, r'^([A-Z][A-Za-z0-9.]*)?$'), ],
name = node.get('name').lower() convert = lambda text: int(text) if text.isdigit() else text return [convert(c) for c in re.split('([0-9]+)', name)] # The following types are used for enums.xml. _INT_TYPE = models.ObjectNodeType( 'int', attributes=[ ('value', str, r'^[-1]|[0-9]+$'), ('label', str, None), ], required_attributes=['value'], text_attribute=True, single_line=True, children=[ models.ChildType(_OBSOLETE_TYPE.tag, _OBSOLETE_TYPE, multiple=False), models.ChildType(_SUMMARY_TYPE.tag, _SUMMARY_TYPE, multiple=False), ]) _ENUM_TYPE = models.ObjectNodeType( 'enum', attributes=[ ('name', str, r'^[A-Za-z0-9_.]+$'), ], required_attributes=['name'], alphabetization=[ (_OBSOLETE_TYPE.tag, _KEEP_ORDER), (_SUMMARY_TYPE.tag, _KEEP_ORDER), (_INT_TYPE.tag, _INTEGER_FN('value')), ], extra_newlines=(1, 1, 1),
# Model definitions for ukm.xml content _OBSOLETE_TYPE = models.TextNodeType('obsolete') _OWNER_TYPE = models.TextNodeType('owner', single_line=True) _SUMMARY_TYPE = models.TextNodeType('summary') _LOWERCASE_NAME_FN = lambda n: n.attributes['name'].value.lower() _METRIC_TYPE = models.ObjectNodeType( 'metric', attributes=[ ('name', unicode), ('semantic_type', unicode), ], children=[ models.ChildType('obsolete', _OBSOLETE_TYPE, False), models.ChildType('owners', _OWNER_TYPE, True), models.ChildType('summary', _SUMMARY_TYPE, False), ]) _EVENT_TYPE = models.ObjectNodeType( 'event', alphabetization=[('metric', _LOWERCASE_NAME_FN)], attributes=[('name', unicode), ('singular', bool)], extra_newlines=(1, 1, 1), children=[ models.ChildType('obsolete', _OBSOLETE_TYPE, False), models.ChildType('owners', _OWNER_TYPE, True), models.ChildType('summary', _SUMMARY_TYPE, False), models.ChildType('metrics', _METRIC_TYPE, True), ])
_ACTION_TYPE = models.ObjectNodeType( 'action', attributes=[ ('name', str, None), ('not_user_triggered', str, r'^$|^true|false|True|False$'), ], required_attributes=['name'], alphabetization=[ (_OBSOLETE_TYPE.tag, _KEEP_ORDER), (_OWNER_TYPE.tag, _KEEP_ORDER), (_DESCRIPTION_TYPE.tag, _KEEP_ORDER), ], extra_newlines=(1, 1, 1), children=[ models.ChildType(_OBSOLETE_TYPE.tag, _OBSOLETE_TYPE, multiple=False), models.ChildType(_OWNER_TYPE.tag, _OWNER_TYPE, multiple=True), models.ChildType(_DESCRIPTION_TYPE.tag, _DESCRIPTION_TYPE, multiple=False), ]) _SUFFIX_TYPE = models.ObjectNodeType( 'suffix', attributes=[ ('name', str, r'^[A-Za-z0-9.-_]*$'), ('label', str, None), ], required_attributes=['name', 'label'], )
], single_line=True) _INDEX_TYPE = models.ObjectNodeType('index', attributes=[ ('fields', str, None), ], single_line=True) _STATISTICS_TYPE = models.ObjectNodeType( 'statistics', attributes=[ ('export', str, r'(?i)^(|true|false)$'), ], children=[ models.ChildType(_QUANTILES_TYPE.tag, _QUANTILES_TYPE, multiple=False), models.ChildType(_ENUMERATION_TYPE.tag, _ENUMERATION_TYPE, multiple=False), ]) _HISTORY_TYPE = models.ObjectNodeType( 'history', attributes=[], alphabetization=[ (_INDEX_TYPE.tag, _LOWERCASE_FN('fields')), (_STATISTICS_TYPE.tag, _KEEP_ORDER), ], children=[ models.ChildType(_INDEX_TYPE.tag, _INDEX_TYPE, multiple=True), models.ChildType(_STATISTICS_TYPE.tag, _STATISTICS_TYPE,
name = node.get('name').lower() convert = lambda text: int(text) if text.isdigit() else text return [convert(c) for c in re.split('([0-9]+)', name)] _INT_TYPE = models.ObjectNodeType('int', attributes=[ ('value', str, r'^[-1]|[0-9]+$'), ('label', str, None), ], required_attributes=['value'], text_attribute=True, single_line=True, children=[ models.ChildType(_OBSOLETE_TYPE.tag, _OBSOLETE_TYPE, multiple=False), models.ChildType(_SUMMARY_TYPE.tag, _SUMMARY_TYPE, multiple=False), ]) _ENUM_TYPE = models.ObjectNodeType('enum', attributes=[ ('name', str, r'^[A-Za-z0-9_.]+$'), ], required_attributes=['name'], alphabetization=[ (_OBSOLETE_TYPE.tag, _KEEP_ORDER), (_SUMMARY_TYPE.tag, _KEEP_ORDER), (_INT_TYPE.tag, _INTEGER_FN('value')),
'hash-functions', ], float_attributes=[ 'fake-prob', 'fake-one-prob', 'one-coin-prob', 'zero-coin-prob', ], string_attributes=['reporting-level']) _RAPPOR_PARAMETERS_TYPE = models.ObjectNodeType( 'rappor-parameters', extra_newlines=(1, 1, 1), string_attributes=['name'], children=[ models.ChildType('summary', _SUMMARY_TYPE, False), models.ChildType('parameters', _PARAMETERS_TYPE, False), ]) _RAPPOR_PARAMETERS_TYPES_TYPE = models.ObjectNodeType( 'rappor-parameter-types', extra_newlines=(1, 1, 1), dont_indent=True, children=[ models.ChildType('types', _RAPPOR_PARAMETERS_TYPE, True), ]) _OWNER_TYPE = models.TextNodeType('owner', single_line=True) _STRING_FIELD_TYPE = models.ObjectNodeType('string-field', extra_newlines=(1, 1, 0),