def addForm(self, formname, forminfo, propdefs): if not s_grammar.isFormName(formname): mesg = f'Invalid form name {formname}' raise s_exc.BadFormDef(name=formname, mesg=mesg) _type = self.types.get(formname) if _type is None: raise s_exc.NoSuchType(name=formname) self._modeldef['forms'].append((formname, forminfo, propdefs)) form = Form(self, formname, forminfo) self.forms[formname] = form self.props[formname] = form for univname, typedef, univinfo in self.univs: self._addFormUniv(form, univname, typedef, univinfo) for propdef in propdefs: if len(propdef) != 3: raise s_exc.BadPropDef(valu=propdef) propname, typedef, propinfo = propdef self._addFormProp(form, propname, typedef, propinfo)
def addForm(self, formname, forminfo, propdefs): if not s_grammar.isFormName(formname): mesg = f'Invalid form name {formname}' raise s_exc.BadFormDef(name=formname, mesg=mesg) _type = self.types.get(formname) if _type is None: raise s_exc.NoSuchType(name=formname) form = Form(self, formname, forminfo) self.forms[formname] = form self.props[formname] = form if isinstance(form.type, s_types.Array): self.arraysbytype[form.type.arraytype.name].append(form) for univname, typedef, univinfo in (u.getPropDef() for u in self.univs.values()): self._addFormUniv(form, univname, typedef, univinfo) for propdef in propdefs: if len(propdef) != 3: raise s_exc.BadPropDef(valu=propdef) propname, typedef, propinfo = propdef self._addFormProp(form, propname, typedef, propinfo) return form
async def addTagProp(self, propname, typedef, propinfo): propname = await tostr(propname) typedef = await toprim(typedef) propinfo = await toprim(propinfo) confirm(('model', 'tagprop', 'add')) if not s_grammar.isBasePropNoPivprop(propname): mesg = f'Invalid prop name {propname}' raise s_exc.BadPropDef(name=propname, mesg=mesg) await self.runt.snap.core.addTagProp(propname, typedef, propinfo)
def __init__(self, model, name, tdef, info): self.name = name self.info = info self.tdef = tdef self.model = model self.utf8 = name.encode() self.nenc = name.encode() + b'\x00' self.base = self.model.types.get(tdef[0]) if self.base is None: raise s_exc.NoSuchType(name=tdef[0]) self.type = self.base.clone(tdef[1]) if isinstance(self.type, s_types.Array): mesg = 'Tag props may not be array types (yet).' raise s_exc.BadPropDef(mesg=mesg)
def addForm(self, formname, forminfo, propdefs): if not s_grammar.isFormName(formname): mesg = f'Invalid form name {formname}' raise s_exc.BadFormDef(name=formname, mesg=mesg) _type = self.types.get(formname) if _type is None: raise s_exc.NoSuchType(name=formname) form = Form(self, formname, forminfo) self.forms[formname] = form self.props[formname] = form if isinstance(form.type, s_types.Array): self.arraysbytype[form.type.arraytype.name].append(form) for univname, typedef, univinfo in (u.getPropDef() for u in self.univs.values()): self._addFormUniv(form, univname, typedef, univinfo) for propdef in propdefs: if len(propdef) != 3: raise s_exc.BadPropDef(valu=propdef) propname, typedef, propinfo = propdef self._addFormProp(form, propname, typedef, propinfo) # interfaces are listed in typeinfo for the form to # maintain backward compatibility for populated models for ifname in form.type.info.get('interfaces', ()): self._addFormIface(form, ifname) return form
def addDataModels(self, mods): ''' Add a list of (name, mdef) tuples. A model definition (mdef) is structured as follows: { "ctors":( ('name', 'class.path.ctor', {}, {'doc': 'The foo thing.'}), ), "types":( ('name', ('basetype', {typeopts}), {info}), ), "forms":( (formname, (typename, typeopts), {info}, ( (propname, (typename, typeopts), {info}), )), ), "univs":( (propname, (typename, typeopts), {info}), ) } Args: mods (list); The list of tuples. ''' # load all the base type ctors in order... for modlname, mdef in mods: for name, ctor, opts, info in mdef.get('ctors', ()): item = s_dyndeps.tryDynFunc(ctor, self, name, info, opts) self.types[name] = item self._modeldef['ctors'].append((name, ctor, opts, info)) # load all the types in order... for modlname, mdef in mods: for typename, (basename, opts), info in mdef.get('types', ()): base = self.types.get(basename) if base is None: raise s_exc.NoSuchType(name=basename) self.types[typename] = base.extend(typename, opts, info) self._modeldef['types'].append( (typename, (basename, opts), info)) # Load all the universal properties for modlname, mdef in mods: for univname, typedef, univinfo in mdef.get('univs', ()): self.addUnivProp(univname, typedef, univinfo) # now we can load all the forms... for modlname, mdef in mods: for formname, forminfo, propdefs in mdef.get('forms', ()): _type = self.types.get(formname) if _type is None: raise s_exc.NoSuchType(name=formname) self._modeldef['forms'].append((formname, forminfo, propdefs)) form = Form(self, formname, forminfo) self.forms[formname] = form self.props[formname] = form for univname, typedef, univinfo in self.univs: self._addFormUniv(form, univname, typedef, univinfo) for propdef in propdefs: if len(propdef) != 3: raise s_exc.BadPropDef(valu=propdef) propname, typedef, propinfo = propdef prop = Prop(self, form, propname, typedef, propinfo) full = f'{formname}:{propname}' self.props[full] = prop self.props[(formname, propname)] = prop self._modelinfo.addDataModels(mods)