Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
 def _get_key(self, key):
     try:
         value = self.metadata[key]
     except KeyError:
         raise exc.APBContentLoadError(
             'Missing "{0}" field in metadata.'.format(key))
     return value
Exemplo n.º 4
0
 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))
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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)