def _parse_unit(self, unit: Unit) -> None: make_opt: bool = unit.min == 0 # ? The optional arm is handling 0, so other arm is set 1 unit.min = 1 if unit.min == 0 else unit.min make_var: bool = unit.max != 1 optionals: list = [] for parent in self.parents: new_node = addict({"key": unit.atts}) if make_var: ln = 1 var_key: int = make_key([[new_node]]) if var_key not in self.vars: new_var = new_node new_var.vars = [addict({"DEF": var_key, "LENGTH": ln})] new_var.data._.var_end = True self.vars[var_key] = [[new_var]] new_node = addict({ "vars": [{ "REF": var_key, "LENGTH": ln, "MIN": unit.min, "MAX": unit.max, }] }) if make_opt: optionals.append(deepcopy(parent)) parent.append(new_node) if unit.label: self._parse_labeled_element(unit.label, parent) self.parents.extend(optionals)
def _add_var(self, children: list, length: int, min_: int, max_: int) -> Any: var_key: int = make_key(children) if var_key not in self.vars: self.vars[var_key] = [] for var_part in children: new_var = deepcopy(var_part) if "vars" not in new_var[0]: new_var[0].vars = [] new_var[0].vars.insert( 0, addict({ "DEF": var_key, "LENGTH": length })) new_var[-1].data._.var_end = True self.vars[var_key].append(new_var) for p in self.vars[var_key]: # block_length is 1 by default and lists are already handled if len(p) == 1 or type(p[0]) == list: continue p[0].data._.update(addict({"block_length": len(p)})) var = addict() var.vars = [ addict({ "REF": var_key, "LENGTH": length, "MIN": min_, "MAX": max_ }) ] return var
def test_node_make_set_key(test): set_attributes = test["set_attributes"] data = test["data"] assert make_key((set_attributes, data)) == hash(FrozenMap.recurse((set_attributes, data)))