def get_settings(self) -> Dict[str, Any]: """Returns settings dictionary""" output = {} ignore = set( dir(Component()) + [ "path", "settings", "properties", "function_name", "type", "netlist", "pins", "settings_changed", ]) params = set(dir(self)) - ignore output["name"] = self.name if hasattr(self, "function_name") and self.function_name: output["function_name"] = self.function_name for key, value in self.settings.items(): output[key] = _clean_value(value) for param in params: output[param] = _clean_value(getattr(self, param)) # output["hash"] = hashlib.md5(json.dumps(output).encode()).hexdigest() # output["hash_geometry"] = str(self.hash_geometry()) output = {k: output[k] for k in sorted(output)} return output
def get_settings( self, ignore=("layer", "layers_cladding", "cladding_offset", "path", "netlist"), include=("name", "function_name", "module", "info"), full_settings=True, ) -> Dict[str, Any]: """Returns settings dictionary. Ignores items from self.ignore set. Args: ignore: settings to ignore include: settings to include full_settings: export full settings or only changed settings """ settings = self.settings if full_settings else self.settings_changed d = {} d["settings"] = {} # function arguments d["info"] = {} # function arguments include = set(include) ignore = set(ignore).union(self.ignore).union(set(dir( Component()))) - include params = set(dir(self)) - ignore - include for param in params: self.info[param] = _clean_value(getattr(self, param)) # for param in params: # d['info'][param] = _clean_value(getattr(self, param)) # d["hash"] = hashlib.md5(json.dumps(output).encode()).hexdigest() # d["hash_geometry"] = str(self.hash_geometry()) for setting in include: if hasattr(self, setting): d[setting] = _clean_value(getattr(self, setting)) for key, value in settings.items(): if key not in self.ignore: d["settings"][key] = _clean_value(value) # print(_clean_value(value)) d = {k: d[k] for k in sorted(d)} return d
def clean_dict(d): """cleans dictionary keys""" from pp.component import _clean_value for k, v in d.items(): if isinstance(v, dict): clean_dict(v) else: d[k] = _clean_value(v)
def _clean_value(value: Any) -> Any: """ returns a clean value to be JSON serializable""" if type(value) in [int, float, str, tuple, bool]: value = value elif isinstance(value, np.int32): value = int(value) elif isinstance(value, np.int64): value = int(value) elif isinstance(value, np.float64): value = float(value) elif callable(value): value = value.__name__ elif hasattr(value, "name"): value = value.name elif hasattr(value, "items"): clean_dict(value) elif hasattr(value, "__iter__"): value = [_clean_value(i) for i in value] else: value = str(value) return value
def _clean_value(value: Any) -> Any: """Returns a clean value that is JSON serializable""" if type(value) in [int, float, str, bool]: return value if isinstance(value, (np.int64, np.int32)): value = int(value) elif isinstance(value, np.float64): value = float(value) elif callable(value): value = value.__name__ elif hasattr(value, "name"): value = value.name elif isinstance(value, dict): clean_dict(value) elif isinstance(value, (tuple, list, ListConfig)): value = [_clean_value(i) for i in value] elif value is None: value = None else: value = str(value) return value
def update_settings(self, **kwargs): """ update settings dict """ for key, value in kwargs.items(): self.settings[key] = _clean_value(value)