aboutsummaryrefslogtreecommitdiff
path: root/netclass/netclass.py
diff options
context:
space:
mode:
authorDeclan Hoare <[email protected]>2020-04-16 22:58:21 +1000
committerDeclan Hoare <[email protected]>2020-04-16 23:10:44 +1000
commit7000fce72fbec34c6f4957a59d4146cc7148ee59 (patch)
tree5affe93d68a7fbcc6cf85a4d9a3eedecc730d1f7 /netclass/netclass.py
downloadshiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.gz
shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.bz2
shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.zip
Initial Release
Diffstat (limited to 'netclass/netclass.py')
-rw-r--r--netclass/netclass.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/netclass/netclass.py b/netclass/netclass.py
new file mode 100644
index 0000000..988bc77
--- /dev/null
+++ b/netclass/netclass.py
@@ -0,0 +1,53 @@
+
+# The netclasses derive this so they can be identified.
+class netclass_root:
+ pass
+
+classes = {}
+
+def netclass(name, assembly, members):
+ member_names = [n for _, n in members]
+ class proxy(netclass_root):
+ def __init__(self, *args, **kwargs):
+ if args == ():
+ super().__setattr__("_contents", kwargs)
+ else:
+ super().__setattr__("_contents", dict(zip(member_names, args)))
+ self._validate()
+
+ def _validate(self):
+ if set(member_names) != set(self._contents.keys()):
+ raise TypeError("The instance does not have the correct members")
+ for typ, name in members:
+ val = self._contents[name]
+ if not isinstance(val, typ):
+ raise TypeError(f"{name} is {val}, must be {typ}")
+
+ @staticmethod
+ def from_dict(d):
+ cleaned = {}
+ for typ, name in members:
+ val = d[name]
+ if isinstance(val, dict) and issubclass(typ, netclass_root):
+ val = typ.from_dict(val)
+ cleaned[name] = val
+ return proxy(**cleaned)
+
+ def __getattr__(self, member):
+ try:
+ return self._contents[member]
+ except KeyError:
+ raise AttributeError(f"No such member {member}")
+
+ def __setattr__(self, member, value):
+ if member in self._members:
+ self._contents[member] = value
+ else:
+ raise AttributeError(f"No such member {member}")
+
+ proxy._name = name
+ proxy._assembly = assembly
+ proxy._members = members
+ proxy.__name__ = name.split(".")[-1]
+ classes[name] = proxy
+ return proxy