import logging import os import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) import models import presubmit_util # Model definitions for rappor.xml content _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),
# i.e. "suffix11" should come after "suffix2" def _NaturalSortByName(node): """Sort by name, ordering numbers in the way humans expect.""" # See: https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/ 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),
import os import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) import models # 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.get('name').lower() _ENUMERATION_TYPE = models.ObjectNodeType('enumeration', attributes=[], single_line=True) _QUANTILES_TYPE = models.ObjectNodeType('quantiles', attributes=[ ('type', unicode, None), ], single_line=True) _INDEX_TYPE = models.ObjectNodeType('index', attributes=[ ('fields', unicode, None), ], single_line=True) _STATISTICS_TYPE = models.ObjectNodeType(
import os import re import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) import models # Model definitions for rappor.xml content _OBSOLETE_TYPE = models.TextNodeType('obsolete') _OWNER_TYPE = models.TextNodeType('owner', single_line=True) _SUMMARY_TYPE = models.TextNodeType('summary') _NOISE_VALUES_TYPE = models.ObjectNodeType('noise-values', attributes=[ ('fake-prob', float), ('fake-one-prob', float), ('one-coin-prob', float), ('zero-coin-prob', float), ]) _NOISE_LEVEL_TYPE = models.ObjectNodeType( 'noise-level', extra_newlines=(1, 1, 1), attributes=[('name', unicode)], 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),
_OBSOLETE_TYPE = models.TextNodeType('obsolete') _OWNER_TYPE = models.TextNodeType('owner', single_line=True) _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.]*$'),
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) import models # 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),
_LOWERCASE_FN = lambda attribute: (lambda node: node.get(attribute).lower()) # A constant function as the sorting key for nodes whose orderings should be # kept as given in the XML file within their parent node. _KEEP_ORDER = lambda node: 1 _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),
import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) import models import presubmit_util # Model definitions for rappor.xml content _SUMMARY_TYPE = models.TextNodeType('summary') _PARAMETERS_TYPE = models.ObjectNodeType('parameters', int_attributes=[ 'num-cohorts', 'bytes', '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), ])