def _check_plans(self): fieldname = 'plans' plans = self._get_key(fieldname) if not isinstance(plans, list): raise exc.APBContentLoadError( 'Expecting "plans" in metadata to be a list') expected_plan_keys = ('description', 'free', 'metadata', 'bindable', 'parameters') expected_plan_meta_keys = ('displayName', 'longDescription', 'cost') expected_parameter_keys = ('name', 'title', 'type', 'required') idx = 0 for plan in plans: if not isinstance(plan, dict): raise exc.APBContentLoadError( 'Expecting "plans" in metadata to be a list of ' 'dictionaries or key:value mappings') try: plan['name'] except KeyError: raise exc.APBContentLoadError( 'Expecting "name" to be defined for each plan found in ' 'metadata.') self._check_for_keys(expected_plan_keys, 'plans[{0}]'.format(idx), plan) if plan.get('metadata'): self._check_for_keys(expected_plan_meta_keys, 'plans[{0}].metadata'.format(idx), plan['metadata']) if plan.get('parameters'): if not isinstance(plan['parameters'], list): raise exc.APBContentLoadError( 'Expecting "parameters" in "plans[{0}]" ' 'of metadata to be a list'.format(idx)) pidx = 0 for params in plan['parameters']: if not isinstance(params, dict): raise exc.APBContentLoadError( 'Expecting "parameters[{0}]" in "plans[{1}]" of ' 'metadata to be a dictionary or mapping of ' 'key:value pairs'.format(idx, pidx)) self._check_for_keys( expected_parameter_keys, 'plans[{0}].parameters[{1}]'.format(idx, pidx), params) for param_key in params.keys(): if param_key in self.PARAM_KEY_MAP: new_key = self.PARAM_KEY_MAP[param_key] self.metadata[fieldname][idx]['parameters'][pidx][ new_key] = self.metadata[fieldname][idx][ 'parameters'][pidx].pop(param_key) pidx += 1 idx += 1
def _check_bindable(self): fieldname = 'bindable' value = self._get_key(fieldname) if not isinstance(value, bool): raise exc.APBContentLoadError( 'Expecting "{0}" in metadata to be a boolean ' 'value'.format(fieldname))
def _get_key(self, key): try: value = self.metadata[key] except KeyError: raise exc.APBContentLoadError( 'Missing "{0}" field in metadata.'.format(key)) return value
def _check_async(self): fieldname = 'async' value = self._get_key(fieldname) if value not in ('optional', 'required', 'unsupported'): raise exc.APBContentLoadError( 'Expecting "{0}" in metadata to be one of "optional", ' '"required", "unsupported"'.format(fieldname))
def parse_name(self): fieldname = 'name' name = sanitize_content_name(self._get_key(fieldname)) if not re.match('^[a-z0-9_]+$', name): raise exc.APBContentLoadError( 'Invalid "{0}" value in metadata. Must contain only lowercase ' 'letters, digits, and underscore'.format(fieldname)) return name
def _check_metadata(self): fieldname = 'metadata' meta = self._get_key(fieldname) if not isinstance(meta, dict): raise exc.APBContentLoadError( 'Expecting "{0}" in metadata to be a dictionary ' 'or key:value mapping'.format(fieldname)) expected_keys = ('documentationUrl', 'imageUrl', 'dependencies', 'displayName', 'longDescription', 'providerDisplayName') self._check_for_keys(expected_keys, fieldname, meta)