--- /dev/null
+.directory
+__pycache__
--- /dev/null
+doku:
+ rm -rf ./doc/*
+ PYTHONPATH=. pipenv run pdoc --template-dir doc-pdoc --html --html-dir ./doc --all-submodules supcon
+ mv ./doc/supcon/* ./doc/
+ rm -rf ./doc/supcon
+ for f in ./doc/*.html; do mv $${f} `dirname $${f}`/`basename $${f} html`md; done
--- /dev/null
+[[source]]
+url = "https://pypi.python.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+"e1839a8" = {path = ".", editable = true}
+
+[dev-packages]
+"e1839a8" = {path = ".", extras = ["e"], editable = true}
+
+[requires]
+python_version = "3"
--- /dev/null
+{
+ "_meta": {
+ "hash": {
+ "sha256": "5222cbe0571531c1844f56e5766605155e243efab356f8b635f0ad9956893afa"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.python.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "asn1crypto": {
+ "hashes": [
+ "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
+ "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
+ ],
+ "version": "==0.24.0"
+ },
+ "attrs": {
+ "hashes": [
+ "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9",
+ "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
+ ],
+ "version": "==17.4.0"
+ },
+ "automat": {
+ "hashes": [
+ "sha256:2140297df155f7990f6f4c73b2ab0583bd8150db9ed2a1b48122abe66e9908c1",
+ "sha256:3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8"
+ ],
+ "version": "==0.6.0"
+ },
+ "cffi": {
+ "hashes": [
+ "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
+ "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
+ "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
+ "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
+ "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
+ "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
+ "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
+ "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
+ "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
+ "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
+ "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
+ "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
+ "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
+ "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
+ "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
+ "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
+ "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
+ "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
+ "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
+ "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
+ "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
+ "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
+ "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
+ "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
+ "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
+ "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
+ "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
+ ],
+ "markers": "platform_python_implementation != 'pypy'",
+ "version": "==1.11.5"
+ },
+ "constantly": {
+ "hashes": [
+ "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35",
+ "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"
+ ],
+ "version": "==15.1.0"
+ },
+ "cryptography": {
+ "hashes": [
+ "sha256:3f3b65d5a16e6b52fba63dc860b62ca9832f51f1a2ae5083c78b6840275f12dd",
+ "sha256:551a3abfe0c8c6833df4192a63371aa2ff43afd8f570ed345d31f251d78e7e04",
+ "sha256:5cb990056b7cadcca26813311187ad751ea644712022a3976443691168781b6f",
+ "sha256:60bda7f12ecb828358be53095fc9c6edda7de8f1ef571f96c00b2363643fa3cd",
+ "sha256:6fef51ec447fe9f8351894024e94736862900d3a9aa2961528e602eb65c92bdb",
+ "sha256:77d0ad229d47a6e0272d00f6bf8ac06ce14715a9fd02c9a97f5a2869aab3ccb2",
+ "sha256:808fe471b1a6b777f026f7dc7bd9a4959da4bfab64972f2bbe91e22527c1c037",
+ "sha256:9b62fb4d18529c84b961efd9187fecbb48e89aa1a0f9f4161c61b7fc42a101bd",
+ "sha256:9e5bed45ec6b4f828866ac6a6bedf08388ffcfa68abe9e94b34bb40977aba531",
+ "sha256:9fc295bf69130a342e7a19a39d7bbeb15c0bcaabc7382ec33ef3b2b7d18d2f63",
+ "sha256:abd070b5849ed64e6d349199bef955ee0ad99aefbad792f0c587f8effa681a5e",
+ "sha256:ba6a774749b6e510cffc2fb98535f717e0e5fd91c7c99a61d223293df79ab351",
+ "sha256:c332118647f084c983c6a3e1dba0f3bcb051f69d12baccac68db8d62d177eb8a",
+ "sha256:d6f46e862ee36df81e6342c2177ba84e70f722d9dc9c6c394f9f1f434c4a5563",
+ "sha256:db6013746f73bf8edd9c3d1d3f94db635b9422f503db3fc5ef105233d4c011ab",
+ "sha256:f57008eaff597c69cf692c3518f6d4800f0309253bb138b526a37fe9ef0c7471",
+ "sha256:f6c821ac253c19f2ad4c8691633ae1d1a17f120d5b01ea1d256d7b602bc59887"
+ ],
+ "version": "==2.2.2"
+ },
+ "e1839a8": {
+ "editable": true,
+ "path": "."
+ },
+ "hyperlink": {
+ "hashes": [
+ "sha256:98da4218a56b448c7ec7d2655cb339af1f7d751cf541469bb4fc28c4a4245b34",
+ "sha256:f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306"
+ ],
+ "version": "==18.0.0"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
+ "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
+ ],
+ "version": "==2.6"
+ },
+ "incremental": {
+ "hashes": [
+ "sha256:717e12246dddf231a349175f48d74d93e2897244939173b01974ab6661406b9f",
+ "sha256:7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+ ],
+ "version": "==17.5.0"
+ },
+ "msgpack-python": {
+ "hashes": [
+ "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
+ ],
+ "version": "==0.5.6"
+ },
+ "pigpio": {
+ "hashes": [
+ "sha256:38bdc1b4d58898e7b4a69de3b0d90e8e8ccd851ac7d03e30791769475ffd941f",
+ "sha256:be1480aecf7c8aba9c92d2846ae153ad4c7e89ae188b28e4bcc579c3bc30e36b"
+ ],
+ "version": "==1.40.post1"
+ },
+ "pyasn1": {
+ "hashes": [
+ "sha256:0d7f6e959fe53f3960a23d73f35e1fce61348b30915b6664309ca756de7c1f89",
+ "sha256:5a0db897b311d265cde49615cf783f1c78613138605cdd0f907ecfa5b2aba3ee",
+ "sha256:758cb50abddc03e4563fd9e7f03db56e3e87b58c0bd01247360326e5c0c7ffa5",
+ "sha256:7d626683e3d792cccc608da02498aff37ab4f3dafd8905d6bf755d11f9b26b43",
+ "sha256:a7efe807c4b83a859e2735c692b92ed7b567cfddc4163763412920041d876c2b",
+ "sha256:b5a9ca48055b9a20f6d1b3d68e38692e5431c86a0f99ea602e61294e891fee5b",
+ "sha256:c07d6e587b2f928366b1f67c09bda026a3e6fcc99e80a744dc67f8fca3895626",
+ "sha256:d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15",
+ "sha256:d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1",
+ "sha256:d84c2aea3cf43780e9e6a19f4e4dddee9f6976519020e64e47c57e5c7a8c3dd2",
+ "sha256:e85895087905c65b5b594eb91f7522664c85545b147d5f4d4e7b1b07da8dcbdc",
+ "sha256:f81c96761fca60d64b1c9b79ec2e40cf9495a745cf570613079ef324aeb9672b"
+ ],
+ "version": "==0.4.2"
+ },
+ "pyasn1-modules": {
+ "hashes": [
+ "sha256:041e9fbafac548d095f5b6c3b328b80792f006196e15a232b731a83c93d59493",
+ "sha256:0cdca76a68dcb701fff58c397de0ef9922b472b1cb3ea9695ca19d03f1869787",
+ "sha256:0cea139045c38f84abaa803bcb4b5e8775ea12a42af10019d942f227acc426c3",
+ "sha256:0f2e50d20bc670be170966638fa0ae603f0bc9ed6ebe8e97a6d1d4cef30cc889",
+ "sha256:47fb6757ab78fe966e7c58b2030b546854f78416d653163f0ce9290cf2278e8b",
+ "sha256:598a6004ec26a8ab40a39ea955068cf2a3949ad9c0030da970f2e1ca4c9f1cc9",
+ "sha256:72fd8b0c11191da088147c6e4678ec53e573923ecf60b57eeac9e97433e09fc2",
+ "sha256:854700bbdd01394e2ada9c1bfbd0ed9f5d0c551350dbbd023e88b11d2771ae06",
+ "sha256:af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc",
+ "sha256:b1f395cae2d669e0830cb023aa86f9f283b7a9aa32317d7f80d8e78aa2745812",
+ "sha256:c6747146e95d2b14cc2a8399b2b0bde3f93778f8f9ec704690d2b589c376c137",
+ "sha256:f53fe5bcebdf318f51399b250fe8325ef3a26d927f012cc0c8e0f9e9af7f9deb"
+ ],
+ "version": "==0.2.1"
+ },
+ "pycparser": {
+ "hashes": [
+ "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
+ ],
+ "version": "==2.18"
+ },
+ "pyopenssl": {
+ "hashes": [
+ "sha256:07a2de1a54de07448732a81e38a55df7da109b2f47f599f8bb35b0cbec69d4bd",
+ "sha256:2c10cfba46a52c0b0950118981d61e72c1e5b1aac451ca1bc77de1a679456773"
+ ],
+ "version": "==17.5.0"
+ },
+ "service-identity": {
+ "hashes": [
+ "sha256:0e76f3c042cc0f5c7e6da002cf646f59dc4023962d1d1166343ce53bdad39e17",
+ "sha256:4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab"
+ ],
+ "version": "==17.0.0"
+ },
+ "six": {
+ "hashes": [
+ "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
+ "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
+ ],
+ "version": "==1.11.0"
+ },
+ "twisted": {
+ "hashes": [
+ "sha256:0da1a7e35d5fcae37bc9c7978970b5feb3bc82822155b8654ec63925c05af75c",
+ "sha256:716805e624f9396fcc1f47e8aef68e629fd31599a74855b6e1636122c042458d",
+ "sha256:7bc3cdfd1ca5e5b84c7936db3c2cb2feb7d5b77410e713fd346da095a3b6a1d2"
+ ],
+ "version": "==17.9.0"
+ },
+ "zope.interface": {
+ "hashes": [
+ "sha256:21506674d30c009271fe68a242d330c83b1b9d76d62d03d87e1e9528c61beea6",
+ "sha256:3d184aff0756c44fff7de69eb4cd5b5311b6f452d4de28cb08343b3f21993763",
+ "sha256:467d364b24cb398f76ad5e90398d71b9325eb4232be9e8a50d6a3b3c7a1c8789",
+ "sha256:57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c",
+ "sha256:9ada83f4384bbb12dedc152bcdd46a3ac9f5f7720d43ac3ce3e8e8b91d733c10",
+ "sha256:a1daf9c5120f3cc6f2b5fef8e1d2a3fb7bbbb20ed4bfdc25bc8364bc62dcf54b",
+ "sha256:e6b77ae84f2b8502d99a7855fa33334a1eb6159de45626905cb3e454c023f339",
+ "sha256:e881ef610ff48aece2f4ee2af03d2db1a146dc7c705561bd6089b2356f61641f",
+ "sha256:f41037260deaacb875db250021fe883bf536bf6414a4fd25b25059b02e31b120"
+ ],
+ "version": "==4.5.0"
+ }
+ },
+ "develop": {
+ "asn1crypto": {
+ "hashes": [
+ "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
+ "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
+ ],
+ "version": "==0.24.0"
+ },
+ "attrs": {
+ "hashes": [
+ "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9",
+ "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
+ ],
+ "version": "==17.4.0"
+ },
+ "automat": {
+ "hashes": [
+ "sha256:2140297df155f7990f6f4c73b2ab0583bd8150db9ed2a1b48122abe66e9908c1",
+ "sha256:3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8"
+ ],
+ "version": "==0.6.0"
+ },
+ "cffi": {
+ "hashes": [
+ "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
+ "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
+ "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
+ "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
+ "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
+ "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
+ "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
+ "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
+ "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
+ "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
+ "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
+ "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
+ "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
+ "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
+ "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
+ "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
+ "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
+ "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
+ "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
+ "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
+ "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
+ "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
+ "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
+ "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
+ "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
+ "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
+ "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
+ ],
+ "markers": "platform_python_implementation != 'pypy'",
+ "version": "==1.11.5"
+ },
+ "constantly": {
+ "hashes": [
+ "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35",
+ "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"
+ ],
+ "version": "==15.1.0"
+ },
+ "cryptography": {
+ "hashes": [
+ "sha256:3f3b65d5a16e6b52fba63dc860b62ca9832f51f1a2ae5083c78b6840275f12dd",
+ "sha256:551a3abfe0c8c6833df4192a63371aa2ff43afd8f570ed345d31f251d78e7e04",
+ "sha256:5cb990056b7cadcca26813311187ad751ea644712022a3976443691168781b6f",
+ "sha256:60bda7f12ecb828358be53095fc9c6edda7de8f1ef571f96c00b2363643fa3cd",
+ "sha256:6fef51ec447fe9f8351894024e94736862900d3a9aa2961528e602eb65c92bdb",
+ "sha256:77d0ad229d47a6e0272d00f6bf8ac06ce14715a9fd02c9a97f5a2869aab3ccb2",
+ "sha256:808fe471b1a6b777f026f7dc7bd9a4959da4bfab64972f2bbe91e22527c1c037",
+ "sha256:9b62fb4d18529c84b961efd9187fecbb48e89aa1a0f9f4161c61b7fc42a101bd",
+ "sha256:9e5bed45ec6b4f828866ac6a6bedf08388ffcfa68abe9e94b34bb40977aba531",
+ "sha256:9fc295bf69130a342e7a19a39d7bbeb15c0bcaabc7382ec33ef3b2b7d18d2f63",
+ "sha256:abd070b5849ed64e6d349199bef955ee0ad99aefbad792f0c587f8effa681a5e",
+ "sha256:ba6a774749b6e510cffc2fb98535f717e0e5fd91c7c99a61d223293df79ab351",
+ "sha256:c332118647f084c983c6a3e1dba0f3bcb051f69d12baccac68db8d62d177eb8a",
+ "sha256:d6f46e862ee36df81e6342c2177ba84e70f722d9dc9c6c394f9f1f434c4a5563",
+ "sha256:db6013746f73bf8edd9c3d1d3f94db635b9422f503db3fc5ef105233d4c011ab",
+ "sha256:f57008eaff597c69cf692c3518f6d4800f0309253bb138b526a37fe9ef0c7471",
+ "sha256:f6c821ac253c19f2ad4c8691633ae1d1a17f120d5b01ea1d256d7b602bc59887"
+ ],
+ "version": "==2.2.2"
+ },
+ "e1839a8": {
+ "editable": true,
+ "path": "."
+ },
+ "hyperlink": {
+ "hashes": [
+ "sha256:98da4218a56b448c7ec7d2655cb339af1f7d751cf541469bb4fc28c4a4245b34",
+ "sha256:f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306"
+ ],
+ "version": "==18.0.0"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
+ "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
+ ],
+ "version": "==2.6"
+ },
+ "incremental": {
+ "hashes": [
+ "sha256:717e12246dddf231a349175f48d74d93e2897244939173b01974ab6661406b9f",
+ "sha256:7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+ ],
+ "version": "==17.5.0"
+ },
+ "msgpack-python": {
+ "hashes": [
+ "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
+ ],
+ "version": "==0.5.6"
+ },
+ "pigpio": {
+ "hashes": [
+ "sha256:38bdc1b4d58898e7b4a69de3b0d90e8e8ccd851ac7d03e30791769475ffd941f",
+ "sha256:be1480aecf7c8aba9c92d2846ae153ad4c7e89ae188b28e4bcc579c3bc30e36b"
+ ],
+ "version": "==1.40.post1"
+ },
+ "pyasn1": {
+ "hashes": [
+ "sha256:0d7f6e959fe53f3960a23d73f35e1fce61348b30915b6664309ca756de7c1f89",
+ "sha256:5a0db897b311d265cde49615cf783f1c78613138605cdd0f907ecfa5b2aba3ee",
+ "sha256:758cb50abddc03e4563fd9e7f03db56e3e87b58c0bd01247360326e5c0c7ffa5",
+ "sha256:7d626683e3d792cccc608da02498aff37ab4f3dafd8905d6bf755d11f9b26b43",
+ "sha256:a7efe807c4b83a859e2735c692b92ed7b567cfddc4163763412920041d876c2b",
+ "sha256:b5a9ca48055b9a20f6d1b3d68e38692e5431c86a0f99ea602e61294e891fee5b",
+ "sha256:c07d6e587b2f928366b1f67c09bda026a3e6fcc99e80a744dc67f8fca3895626",
+ "sha256:d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15",
+ "sha256:d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1",
+ "sha256:d84c2aea3cf43780e9e6a19f4e4dddee9f6976519020e64e47c57e5c7a8c3dd2",
+ "sha256:e85895087905c65b5b594eb91f7522664c85545b147d5f4d4e7b1b07da8dcbdc",
+ "sha256:f81c96761fca60d64b1c9b79ec2e40cf9495a745cf570613079ef324aeb9672b"
+ ],
+ "version": "==0.4.2"
+ },
+ "pyasn1-modules": {
+ "hashes": [
+ "sha256:041e9fbafac548d095f5b6c3b328b80792f006196e15a232b731a83c93d59493",
+ "sha256:0cdca76a68dcb701fff58c397de0ef9922b472b1cb3ea9695ca19d03f1869787",
+ "sha256:0cea139045c38f84abaa803bcb4b5e8775ea12a42af10019d942f227acc426c3",
+ "sha256:0f2e50d20bc670be170966638fa0ae603f0bc9ed6ebe8e97a6d1d4cef30cc889",
+ "sha256:47fb6757ab78fe966e7c58b2030b546854f78416d653163f0ce9290cf2278e8b",
+ "sha256:598a6004ec26a8ab40a39ea955068cf2a3949ad9c0030da970f2e1ca4c9f1cc9",
+ "sha256:72fd8b0c11191da088147c6e4678ec53e573923ecf60b57eeac9e97433e09fc2",
+ "sha256:854700bbdd01394e2ada9c1bfbd0ed9f5d0c551350dbbd023e88b11d2771ae06",
+ "sha256:af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc",
+ "sha256:b1f395cae2d669e0830cb023aa86f9f283b7a9aa32317d7f80d8e78aa2745812",
+ "sha256:c6747146e95d2b14cc2a8399b2b0bde3f93778f8f9ec704690d2b589c376c137",
+ "sha256:f53fe5bcebdf318f51399b250fe8325ef3a26d927f012cc0c8e0f9e9af7f9deb"
+ ],
+ "version": "==0.2.1"
+ },
+ "pycparser": {
+ "hashes": [
+ "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
+ ],
+ "version": "==2.18"
+ },
+ "pyopenssl": {
+ "hashes": [
+ "sha256:07a2de1a54de07448732a81e38a55df7da109b2f47f599f8bb35b0cbec69d4bd",
+ "sha256:2c10cfba46a52c0b0950118981d61e72c1e5b1aac451ca1bc77de1a679456773"
+ ],
+ "version": "==17.5.0"
+ },
+ "service-identity": {
+ "hashes": [
+ "sha256:0e76f3c042cc0f5c7e6da002cf646f59dc4023962d1d1166343ce53bdad39e17",
+ "sha256:4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab"
+ ],
+ "version": "==17.0.0"
+ },
+ "six": {
+ "hashes": [
+ "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
+ "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
+ ],
+ "version": "==1.11.0"
+ },
+ "twisted": {
+ "hashes": [
+ "sha256:0da1a7e35d5fcae37bc9c7978970b5feb3bc82822155b8654ec63925c05af75c",
+ "sha256:716805e624f9396fcc1f47e8aef68e629fd31599a74855b6e1636122c042458d",
+ "sha256:7bc3cdfd1ca5e5b84c7936db3c2cb2feb7d5b77410e713fd346da095a3b6a1d2"
+ ],
+ "version": "==17.9.0"
+ },
+ "zope.interface": {
+ "hashes": [
+ "sha256:21506674d30c009271fe68a242d330c83b1b9d76d62d03d87e1e9528c61beea6",
+ "sha256:3d184aff0756c44fff7de69eb4cd5b5311b6f452d4de28cb08343b3f21993763",
+ "sha256:467d364b24cb398f76ad5e90398d71b9325eb4232be9e8a50d6a3b3c7a1c8789",
+ "sha256:57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c",
+ "sha256:9ada83f4384bbb12dedc152bcdd46a3ac9f5f7720d43ac3ce3e8e8b91d733c10",
+ "sha256:a1daf9c5120f3cc6f2b5fef8e1d2a3fb7bbbb20ed4bfdc25bc8364bc62dcf54b",
+ "sha256:e6b77ae84f2b8502d99a7855fa33334a1eb6159de45626905cb3e454c023f339",
+ "sha256:e881ef610ff48aece2f4ee2af03d2db1a146dc7c705561bd6089b2356f61641f",
+ "sha256:f41037260deaacb875db250021fe883bf536bf6414a4fd25b25059b02e31b120"
+ ],
+ "version": "==4.5.0"
+ }
+ }
+}
--- /dev/null
+#!/usr/bin/env python3
+
+import time
+import supcon.intf
+import supcon.core
+import supcon.clone
+
+from twisted.internet import reactor
+from twisted.internet.endpoints import TCP4ServerEndpoint
+
+""" the interface com.example.Clock """
+ComExampleClockIntf = supcon.intf.DInterface.load({
+ 'name': 'com.example.Clock',
+ 'events': [
+ {
+ 'name': 'tick',
+ 'args': [
+ { 'name': 'time', 'description': 'The current time' }
+ ],
+ 'description': 'Fires every second'
+ }
+ ]
+})
+
+""" an implementation of the interface com.example.Clock """
+class ComExampleClockImpl(supcon.intf.Implementation):
+
+ def __init__(self, reactor):
+ super().__init__(ComExampleClockIntf)
+
+ self.__reactor = reactor
+ reactor.callLater(1, self.__tick)
+
+ def __tick(self):
+ t = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
+ self.fire('tick', { 'time': t })
+ self.__reactor.callLater(1, self.__tick)
+
+""" create the implementation instanz """
+clockImpl = ComExampleClockImpl(reactor)
+
+""" create the local node """
+local = supcon.core.Node('clock-test')
+
+""" register the clock instance """
+def register():
+ if register.registered:
+ local.unregister('/clock5', clockImpl)
+ else:
+ local.register('/clock5', clockImpl)
+ register.registered = not register.registered
+ reactor.callLater(5, register)
+register.registered = False
+
+register()
+local.register('/clock', clockImpl)
+
+supcon.clone.Cloner(local, '/clone5', local.name, '/clock5', 'com.example.Clock')
+
+local.listen(TCP4ServerEndpoint(reactor, 8123))
+
+reactor.run()
--- /dev/null
+<%def name="pdoc()">
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+</%def>
+
+<%def name="pre()">
+</%def>
+
+<%def name="post()">
+</%def>
--- /dev/null
+<%
+ import re
+ import sys
+
+ import markdown
+ try:
+ import pygments
+ import pygments.formatters
+ import pygments.lexers
+ use_pygments = True
+ except ImportError:
+ use_pygments = False
+
+ import pdoc
+
+ # From language reference, but adds '.' to allow fully qualified names.
+ pyident = re.compile('^[a-zA-Z_][a-zA-Z0-9_.]+$')
+ indent = re.compile('^\s*')
+
+ # Whether we're showing the module list or a single module.
+ module_list = 'modules' in context.keys()
+
+ pdoc.html_module_suffix = '.m.md'
+ pdoc.html_package_name = 'index.md'
+
+ link_prefix = '/screwerk/'
+
+ def decode(s):
+ if sys.version_info[0] < 3 and isinstance(s, str):
+ return s.decode('utf-8', 'ignore')
+ return s
+
+ def ident(s):
+ return '<span class="ident">%s</span>' % s
+
+ def sourceid(dobj):
+ return 'source-%s' % dobj.refname
+
+ def clean_source_lines(lines):
+ """
+ Cleans the source code so that pygments can render it well.
+
+ Returns one string with all of the source code.
+ """
+ base_indent = len(indent.match(lines[0]).group(0))
+ base_indent = 0
+ for line in lines:
+ if len(line.strip()) > 0:
+ base_indent = len(indent.match(lines[0]).group(0))
+ break
+ lines = [line[base_indent:] for line in lines]
+ if not use_pygments: # :-(
+ return '<pre><code>%s</code></pre>' % (''.join(lines))
+
+ pylex = pygments.lexers.PythonLexer()
+ htmlform = pygments.formatters.HtmlFormatter(cssclass='codehilite')
+ return pygments.highlight(''.join(lines), pylex, htmlform)
+
+ def linkify(match):
+ matched = match.group(0)
+ ident = matched[1:-1]
+ name, url = lookup(ident)
+ if name is None:
+ return matched
+ return '[`%s`](%s)' % (name, url)
+
+ def mark(s, linky=True):
+ if linky:
+ s, _ = re.subn('\b\n\b', ' ', s)
+ if not module_list:
+ s, _ = re.subn('`[^`]+`', linkify, s)
+
+ extensions = []
+ if use_pygments:
+ extensions = ['markdown.extensions.codehilite(linenums=False)']
+ s = markdown.markdown(s.strip(), extensions=extensions)
+ return s
+
+ def glimpse(s, length=100):
+ if len(s) < length:
+ return s
+ return s[0:length] + '...'
+
+ def module_url(m):
+ """
+ Returns a URL for `m`, which must be an instance of `Module`.
+ Also, `m` must be a submodule of the module being documented.
+
+ Namely, '.' import separators are replaced with '/' URL
+ separators. Also, packages are translated as directories
+ containing `index.html` corresponding to the `__init__` module,
+ while modules are translated as regular HTML files with an
+ `.m.html` suffix. (Given default values of
+ `pdoc.html_module_suffix` and `pdoc.html_package_name`.)
+ """
+ #if module.name == m.name:
+ # return ''
+
+ if len(link_prefix) > 0:
+ base = m.name
+ else:
+ base = m.name[len(module.name)+1:]
+ url = base.replace('.', '/')
+ if m.is_package():
+ url += '/%s' % pdoc.html_package_name
+ else:
+ url += pdoc.html_module_suffix
+ return link_prefix + url
+
+ def external_url(refname):
+ """
+ Attempts to guess an absolute URL for the external identifier
+ given.
+
+ Note that this just returns the refname with an ".ext" suffix.
+ It will be up to whatever is interpreting the URLs to map it
+ to an appropriate documentation page.
+ """
+ return '/%s.ext' % refname
+
+ def is_external_linkable(name):
+ return external_links and pyident.match(name) and '.' in name
+
+ def lookup(refname):
+ """
+ Given a fully qualified identifier name, return its refname
+ with respect to the current module and a value for a `href`
+ attribute. If `refname` is not in the public interface of
+ this module or its submodules, then `None` is returned for
+ both return values. (Unless this module has enabled external
+ linking.)
+
+ In particular, this takes into account sub-modules and external
+ identifiers. If `refname` is in the public API of the current
+ module, then a local anchor link is given. If `refname` is in the
+ public API of a sub-module, then a link to a different page with
+ the appropriate anchor is given. Otherwise, `refname` is
+ considered external and no link is used.
+ """
+ d = module.find_ident(refname)
+ if isinstance(d, pdoc.External):
+ if is_external_linkable(refname):
+ return d.refname, external_url(d.refname)
+ else:
+ return None, None
+ if isinstance(d, pdoc.Module):
+ return d.refname, module_url(d)
+ if module.is_public(d.refname):
+ #return d.name, '#%s' % d.refname
+ return d.name, '%s#%s' % (module_url(d.module), d.refname)
+ return d.refname, '%s#%s' % (module_url(d.module), d.refname)
+
+ def link(refname):
+ """
+ A convenience wrapper around `href` to produce the full
+ `a` tag if `refname` is found. Otherwise, plain text of
+ `refname` is returned.
+ """
+ name, url = lookup(refname)
+ if name is None:
+ return refname
+ return '<a href="%s">%s</a>' % (url, name)
+
+ def lookupObj(cls, name):
+ for pCls in cls.__mro__:
+ pVars = vars(pCls)
+ if name in pVars:
+ return pVars[name]
+
+ def isInstMethod(o):
+ if not isinstance(o, pdoc.Function):
+ return False
+ if not o.cls or not o.cls.cls:
+ return False
+ obj = lookupObj(o.cls.cls, o.name)
+ if isinstance(obj, classmethod):
+ return False
+ if isinstance(obj, staticmethod):
+ return False
+ return True
+
+ def isClassMethod(o):
+ if not isinstance(o, pdoc.Function):
+ return False
+ if not o.cls or not o.cls.cls:
+ return False
+ obj = lookupObj(o.cls.cls, o.name)
+ if not isinstance(obj, classmethod):
+ return False
+ return True
+
+ def isStaticMethod(o):
+ if not isinstance(o, pdoc.Function):
+ return False
+ if not o.cls or not o.cls.cls:
+ return False
+ obj = lookupObj(o.cls.cls, o.name)
+ if not isinstance(obj, staticmethod):
+ return False
+ return True
+
+ def cInstMethods(c):
+ p = lambda o: isInstMethod(o) and c.module._docfilter(o)
+ return sorted(filter(p, c.doc.values()))
+
+ def cClassMethods(c):
+ p = lambda o: isClassMethod(o) and c.module._docfilter(o)
+ return sorted(filter(p, c.doc.values()))
+
+ def cStaticMethods(c):
+ p = lambda o: isStaticMethod(o) and c.module._docfilter(o)
+ return sorted(filter(p, c.doc.values()))
+
+%>
+<%def name="show_source(d)">
+ % if show_source_code and d.source is not None and len(d.source) > 0:
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('${sourceid(d)}', this);">Show source ≡</a></p>
+ <div id="${sourceid(d)}" class="source">
+ ${decode(clean_source_lines(d.source))}
+ </div>
+ % endif
+</%def>
+
+<%def name="show_desc(d, limit=None)">
+ <%
+ inherits = (hasattr(d, 'inherits')
+ and (len(d.docstring) == 0
+ or d.docstring == d.inherits.docstring))
+ docstring = (d.inherits.docstring if inherits else d.docstring).strip()
+ if limit is not None:
+ docstring = glimpse(docstring, limit)
+ %>
+ % if len(docstring) > 0:
+ % if inherits:
+ <div class="desc inherited">${docstring | mark}</div>
+ % else:
+ <div class="desc">${docstring | mark}</div>
+ % endif
+ % endif
+ % if not isinstance(d, pdoc.Module):
+ <div class="source_cont">${show_source(d)}</div>
+ % endif
+</%def>
+
+<%def name="show_inheritance(d)">
+ % if hasattr(d, 'inherits'):
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ % if hasattr(d.inherits, 'cls'):
+ <code>${link(d.inherits.cls.refname)}</code>.<code>${link(d.inherits.refname)}</code>
+ % else:
+ <code>${link(d.inherits.refname)}</code>
+ % endif
+ </p>
+ % endif
+</%def>
+
+<%def name="show_module_list(modules)">
+<h1>Python module list</h1>
+
+% if len(modules) == 0:
+ <p>No modules found.</p>
+% else:
+ <table id="module-list">
+ % for name, desc in modules:
+ <tr>
+ <td><a href="${link_prefix}${name}">${name}</a></td>
+ <td>
+ % if len(desc.strip()) > 0:
+ <div class="desc">${desc | mark}</div>
+ % endif
+ </td>
+ </tr>
+ % endfor
+ </table>
+% endif
+</%def>
+
+<%def name="show_column_list(items, numcols=3)">
+ <ul>
+ % for item in items:
+ <li class="mono">${item}</li>
+ % endfor
+ </ul>
+</%def>
+
+<%def name="show_module(module)">
+ <%
+ variables = module.variables()
+ classes = module.classes()
+ functions = module.functions()
+ submodules = module.submodules()
+ %>
+
+ <%def name="show_func(f)">
+ <div class="item">
+ <div class="name def" id="${f.refname}">
+ <p>def ${ident(f.name)}(</p><p>${f.spec() | h})</p>
+ </div>
+ ${show_inheritance(f)}
+ ${show_desc(f)}
+ </div>
+ </%def>
+
+ % if 'http_server' in context.keys() and http_server:
+ <p id="nav">
+ <a href="/">All packages</a>
+ <% parts = module.name.split('.')[:-1] %>
+ % for i, m in enumerate(parts):
+ <% parent = '.'.join(parts[:i+1]) %>
+ :: <a href="/${parent.replace('.', '/')}">${parent}</a>
+ % endfor
+ </p>
+ % endif
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">${module.name}</span> module</h1>
+ ${module.docstring | mark}
+ ${show_source(module)}
+ </header>
+
+ <section id="section-items">
+ % if len(variables) > 0:
+ <h2 class="section-title" id="header-variables">Module variables</h2>
+ % for v in variables:
+ <div class="item">
+ <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+ ${show_desc(v)}
+ </div>
+ % endfor
+ % endif
+
+ % if len(functions) > 0:
+ <h2 class="section-title" id="header-functions">Functions</h2>
+ % for f in functions:
+ ${show_func(f)}
+ % endfor
+ % endif
+
+ % if len(classes) > 0:
+ <h2 class="section-title" id="header-classes">Classes</h2>
+ % for c in classes:
+ <%
+ class_vars = c.class_variables()
+ inst_vars = c.instance_variables()
+ instMethods = cInstMethods(c)
+ classMethods = cClassMethods(c)
+ staticMethods = cStaticMethods(c)
+ mro = c.module.mro(c)
+ %>
+ <div class="item">
+ <p id="${c.refname}" class="name">class ${ident(c.name)}</p>
+ ${show_desc(c)}
+
+ <div class="class">
+ % if len(mro) > 0:
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ % for cls in mro:
+ <li>${link(cls.refname)}</li>
+ % endfor
+ </ul>
+ % endif
+ % if len(staticMethods) > 0:
+ <h3>Static Methods</h3>
+ % for f in staticMethods:
+ ${show_func(f)}
+ % endfor
+ % endif
+ % if len(class_vars) > 0:
+ <h3>Class variables</h3>
+ % for v in class_vars:
+ <div class="item">
+ <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+ ${show_inheritance(v)}
+ ${show_desc(v)}
+ </div>
+ % endfor
+ % endif
+ % if len(classMethods) > 0:
+ <h3>Class Methods</h3>
+ % for f in classMethods:
+ ${show_func(f)}
+ % endfor
+ % endif
+ % if len(inst_vars) > 0:
+ <h3>Instance variables</h3>
+ % for v in inst_vars:
+ <div class="item">
+ <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+ ${show_inheritance(v)}
+ ${show_desc(v)}
+ </div>
+ % endfor
+ % endif
+ % if len(instMethods) > 0:
+ <h3>Methods</h3>
+ % for f in instMethods:
+ ${show_func(f)}
+ % endfor
+ % endif
+ </div>
+ </div>
+ % endfor
+ % endif
+
+ % if len(submodules) > 0:
+ <h2 class="section-title" id="header-submodules">Sub-modules</h2>
+ % for m in submodules:
+ <div class="item">
+ <p class="name">${link(m.refname)}</p>
+ ${show_desc(m, limit=300)}
+ </div>
+ % endfor
+ % endif
+ </section>
+</%def>
+
+<%def name="module_index(module)">
+ <%
+ variables = module.variables()
+ classes = module.classes()
+ functions = module.functions()
+ submodules = module.submodules()
+ %>
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+ % if len(variables) > 0:
+ <li class="set"><h3><a href="${module_url(module)}#header-variables">Module variables</a></h3>
+ ${show_column_list(map(lambda v: link(v.refname), variables))}
+ </li>
+ % endif
+
+ % if len(functions) > 0:
+ <li class="set"><h3><a href="${module_url(module)}#header-functions">Functions</a></h3>
+ ${show_column_list(map(lambda f: link(f.refname), functions))}
+ </li>
+ % endif
+
+ % if len(classes) > 0:
+ <li class="set"><h3><a href="${module_url(module)}#header-classes">Classes</a></h3>
+ <ul>
+ % for c in classes:
+ <li class="mono">
+ <span class="class_name">${link(c.refname)}</span>
+ <%
+ #methods = c.functions() + c.methods()
+ methods = cStaticMethods(c) + cClassMethods(c) + cInstMethods(c)
+ %>
+ % if len(methods) > 0:
+ ${show_column_list(map(lambda f: link(f.refname), methods))}
+ % endif
+ </li>
+ % endfor
+ </ul>
+ </li>
+ % endif
+
+ % if len(submodules) > 0:
+ <li class="set"><h3><a href="${module_url(module)}#header-submodules">Sub-modules</a></h3>
+ <ul>
+ % for m in submodules:
+ <li class="mono">${link(m.refname)}</li>
+ % endfor
+ </ul>
+ </li>
+ % endif
+ </ul>
+ </div>
+</%def>
+
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+<%namespace name="css" file="css.mako" />
+
+<style type="text/css">
+${css.pdoc()}
+</style>
+
+% if use_pygments:
+<style type="text/css">
+${pygments.formatters.HtmlFormatter().get_style_defs('.codehilite')}
+</style>
+% endif
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+ % if module_list:
+ <article id="content">
+ ${show_module_list(modules)}
+ </article>
+ % else:
+ ${module_index(module)}
+ <article id="content">
+ ${show_module(module)}
+ </article>
+ % endif
+</div>
--- /dev/null
+## Define mini-templates for each portion of the doco.
+
+<%
+ import re
+ import pdoc
+
+ def indent(s, spaces=4):
+ """
+ Inserts `spaces` after each string of new lines in `s`
+ and before the start of the string.
+ """
+ new = re.sub('(\n+)', '\\1%s' % (' ' * spaces), s)
+ return (' ' * spaces) + new.strip()
+
+ def docstring(d):
+ if len(d.docstring) == 0 and hasattr(d, 'inherits'):
+ return d.inherits.docstring
+ else:
+ return d.docstring
+
+ def submoduleRef(m):
+ ref = './{}' if m.is_package() else './{}.m.md'
+ return ref.format(m.name.split('.')[-1])
+
+ def header(n, header):
+ return '#' * n + ' {}'.format(header)
+
+ def url(d, suffix = None):
+ if d.refname[0:len(module.refname)] != module.refname:
+ raise ValueError(d.refname)
+ url = '#' + d.refname[len(module.refname) + 1:]
+ url+= '-{}'.format(suffix) if suffix else ''
+ return url
+
+ def target(d, suffix = None):
+ url = d.refname[len(module.refname) + 1:]
+ url+= '-{}'.format(suffix) if suffix else ''
+ return '<a name="{}"></a>'.format(url)
+
+ def linkTo(label, d, suffix = None):
+ if isinstance(d, pdoc.External):
+ return label
+ return '[{}]({})'.format(label, url(d, suffix))
+%>
+
+<%def name="function(func)" filter="trim">
+${func.name}(${func.spec()})
+${docstring(func) | indent}
+</%def>
+
+<%def name="variable(var)" filter="trim">
+${var.name}
+${docstring(var) | indent}
+</%def>
+
+<%def name="class_(cls)" filter="trim">
+${target(cls)}
+${header(3, cls.name)}
+% if len(cls.docstring) > 0:
+
+${cls.docstring}
+% endif
+<%
+ class_vars = cls.class_variables()
+ static_methods = cls.functions()
+ inst_vars = cls.instance_variables()
+ methods = cls.methods()
+ mro = cls.module.mro(cls)
+ descendents = cls.module.descendents(cls)
+%>
+% if len(mro) > 0:
+${header(4, 'Ancestors (in MRO)')}
+% for c in mro:
+* ${linkTo(c.refname, c)}
+% endfor
+
+% endif
+% if len(descendents) > 0:
+${header(4, 'Descendents')}
+% for c in descendents:
+* ${linkTo(c.refname, c)}
+% endfor
+
+% endif
+% if len(class_vars) > 0:
+${header(4, 'Class variables')}
+ % for v in class_vars:
+${capture(variable, v) | indent}
+
+ % endfor
+% endif
+% if len(static_methods) > 0:
+${header(4, 'Static methods')}
+ % for f in static_methods:
+${capture(function, f) | indent}
+
+ % endfor
+% endif
+% if len(inst_vars) > 0:
+${header(4, 'Instance variables')}
+ % for v in inst_vars:
+${variable(v)}
+
+ % endfor
+% endif
+% if len(methods) > 0:
+${header(4, 'Methods')}
+ % for m in methods:
+${capture(function, m) | indent}
+
+ % endfor
+% endif
+</%def>
+
+## Start the output logic for an entire module.
+
+<%
+ variables = module.variables()
+ classes = module.classes()
+ functions = module.functions()
+ submodules = module.submodules()
+%>
+
+${header(1, 'Module '+module.name)}
+% if not module._filtering:
+${module.docstring}
+% endif
+
+
+% if len(variables) > 0:
+${header(2, 'Variables')}
+ % for v in variables:
+${variable(v)}
+
+ % endfor
+% endif
+
+
+% if len(functions) > 0:
+${header(2, 'Functions')}
+ % for f in functions:
+${function(f)}
+
+ % endfor
+% endif
+
+
+% if len(classes) > 0:
+${header(2, 'Classes')}
+ % for c in classes:
+${class_(c)}
+
+ % endfor
+% endif
+
+
+% if len(submodules) > 0:
+${header(2, 'Sub-modules')}
+% for m in submodules:
+[${m.name}](${submoduleRef(m)})
+% endfor
+% endif
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+
+ <li class="set"><h3><a href="/screwerk/supcon/clone.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner">Cloner</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner.__init__">__init__</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.clone</span> module</h1>
+
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone', this);">Show source ≡</a></p>
+ <div id="source-supcon.clone" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="k">class</span> <span class="nc">_Clone</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">,</span> <span class="n">rnode</span><span class="p">,</span> <span class="n">rpath</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span> <span class="o">=</span> <span class="n">rnode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span> <span class="o">=</span> <span class="n">rpath</span>
+
+ <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__on</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__on</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="p">(</span><span class="n">_Node</span><span class="p">,</span> <span class="n">_Path</span><span class="p">,</span> <span class="n">_Intf</span><span class="p">,</span> <span class="n">eEvent</span><span class="p">)</span> <span class="o">=</span> <span class="n">event</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="n">eEvent</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="c1">#print('_Clone.call', method, inArgs)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Cloner</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1">#print('Cloner.__init__')</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">local</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">lPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rNode</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span>
+
+ <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="s1">'node'</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="ow">or</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">aInterface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">aInterface</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">event</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'intf'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">aInterface</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__teardownImpl</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__setupImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+ <span class="c1">#print('Cloner.__setupImpl')</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="n">_Clone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__teardownImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.clone.Cloner" class="name">class <span class="ident">Cloner</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone.Cloner', this);">Show source ≡</a></p>
+ <div id="source-supcon.clone.Cloner" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Cloner</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1">#print('Cloner.__init__')</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">local</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">lPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rNode</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">rIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span>
+
+ <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="s1">'node'</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="ow">or</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">aInterface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">aInterface</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">event</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'intf'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">aInterface</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__teardownImpl</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__setupImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+ <span class="c1">#print('Cloner.__setupImpl')</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="n">_Clone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__teardownImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner">Cloner</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.clone.Cloner.lPath" class="name">var <span class="ident">lPath</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.clone.Cloner.local" class="name">var <span class="ident">local</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.clone.Cloner.rIntf" class="name">var <span class="ident">rIntf</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.clone.Cloner.rNode" class="name">var <span class="ident">rNode</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.clone.Cloner.rPath" class="name">var <span class="ident">rPath</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.clone.Cloner.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, local, lPath, rNode, rPath, rIntf)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone.Cloner.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.clone.Cloner.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1">#print('Cloner.__init__')</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+ <li class="set"><h3><a href="/screwerk/supcon/core.m.md#header-variables">Module variables</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.LocalIntf">LocalIntf</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.RemoteIntf">RemoteIntf</a></li>
+ </ul>
+
+ </li>
+
+
+ <li class="set"><h3><a href="/screwerk/supcon/core.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/core.m.md#supcon.core.Node">Node</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.call">call</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.connect">connect</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.listen">listen</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.nodes">nodes</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.off">off</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.on">on</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.register">register</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.unregister">unregister</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.core</span> module</h1>
+ <p>This module provides the implementation of abstract class <code>supcon.intf.Node</code>.</p>
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core', this);">Show source ≡</a></p>
+ <div id="source-supcon.core" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">"""</span>
+<span class="sd">This module provides the implementation of abstract class `supcon.intf.Node`.</span>
+<span class="sd">"""</span>
+
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">traceback</span>
+
+<span class="kn">import</span> <span class="nn">uuid</span>
+<span class="kn">import</span> <span class="nn">struct</span>
+<span class="kn">import</span> <span class="nn">msgpack</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span> <span class="kn">as</span> <span class="nn">defer</span>
+<span class="kn">import</span> <span class="nn">twisted.internet.protocol</span>
+<span class="kn">import</span> <span class="nn">twisted.internet.endpoints</span>
+
+<span class="kn">import</span> <span class="nn">twisted.application.service</span>
+<span class="kn">import</span> <span class="nn">twisted.application.internet</span>
+
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="n">_printArgs</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'{}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]))</span>
+
+<span class="n">LocalIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'supcon.Local'</span><span class="p">,</span>
+ <span class="s1">'events'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The node'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'nodeLost'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The lost node'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The node'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'pathLost'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The node'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The node'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intfLost'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The node'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">],</span>
+ <span class="s1">'methods'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'nodes'</span><span class="p">,</span>
+ <span class="s1">'outArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'nodes'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'A datastructure about all known nodes, paths and interfaces'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">],</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'All methods and events are only locally available'</span>
+<span class="p">})</span>
+
+<span class="n">RemoteIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'supcon.Remote'</span><span class="p">,</span>
+ <span class="s1">'events'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intfLost'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">],</span>
+ <span class="s1">'methods'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span>
+ <span class="s1">'outArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'A datastructure about all paths and interfaces of the node'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'on'</span><span class="p">,</span>
+ <span class="s1">'inArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'event'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The event'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'off'</span><span class="p">,</span>
+ <span class="s1">'inArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'path'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The path'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The interface'</span><span class="p">},</span>
+ <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'event'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The event'</span><span class="p">},</span>
+ <span class="p">],</span>
+ <span class="p">},</span>
+ <span class="p">],</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'All methods and events are only used internally'</span>
+<span class="p">})</span>
+
+
+<span class="k">class</span> <span class="nc">_Protocol</span><span class="p">(</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">Protocol</span><span class="p">):</span>
+ <span class="sd">"""This class handels handshake and message encoding between nodes on the bus.</span>
+
+<span class="sd"> This class is just an implementation detail of the class Node.</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'handshake'</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">name</span>
+ <span class="p">})</span>
+
+ <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)</span> <span class="o">></span> <span class="mi">4</span><span class="p">:</span>
+
+ <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s1">'<L'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)</span> <span class="o"><</span> <span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">:</span>
+ <span class="k">break</span>
+
+ <span class="n">mesg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">:]</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">mesg</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">mesg</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">recvMesg</span><span class="p">(</span><span class="n">mesg</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesg</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'handshake'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">mesg</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">sendMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesg</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="n">mesg</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">'<L'</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">_Factory</span><span class="p">(</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">Factory</span><span class="p">):</span>
+ <span class="sd">"""This class creates _Protocol instances for connections to remote nodes.</span>
+
+<span class="sd"> This class is just an implementation detail of the class Node and encapulates</span>
+<span class="sd"> methods to create the _Protocol instances resulting from calls to</span>
+<span class="sd"> Node.connect() and Node.listen().</span>
+<span class="sd"> """</span>
+ <span class="n">protocol</span> <span class="o">=</span> <span class="n">_Protocol</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">addNode</span><span class="p">,</span> <span class="n">delNode</span><span class="p">,</span> <span class="n">recvMesg</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addNode</span> <span class="o">=</span> <span class="n">addNode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">delNode</span> <span class="o">=</span> <span class="n">delNode</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">recvMesg</span> <span class="o">=</span> <span class="n">recvMesg</span>
+
+
+<span class="k">class</span> <span class="nc">_KnownMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fire</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span> <span class="o">=</span> <span class="n">fire</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNodes</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'node'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">for</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'nodeLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="c1">#_printArgs('_KnownMgr.addIntf', node, path, interface)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'path'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">})</span>
+
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'intf'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="c1">#_printArgs('_KnownMgr.delIntf', node, path, interface)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'intfLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">'pathLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'node'</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">})</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">getNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">setNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newNode</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="p">):</span>
+ <span class="c1">#_printArgs('_KnownMgr.setNode', newNode.dump())</span>
+ <span class="n">oldNode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="n">newNode</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">oldPath</span> <span class="ow">in</span> <span class="n">oldNode</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">oldIntf</span> <span class="ow">in</span> <span class="n">oldPath</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">newNode</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">oldPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldIntf</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">oldNode</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldIntf</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">newPath</span> <span class="ow">in</span> <span class="n">newNode</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">newIntf</span> <span class="ow">in</span> <span class="n">newPath</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">oldNode</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">newPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newIntf</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">newNode</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newIntf</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">getNodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span>
+
+
+<span class="k">class</span> <span class="nc">_InformMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
+
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="ow">or</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+ <span class="k">return</span>
+
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">_DeferredMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">""" This class manages Deferred """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span> <span class="o">-></span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="sd">"""Creates a Deferred with an info.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> data: Some additional data</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> (str, defer.Deferred): A Tuple of an unique id and a Deferred</span>
+<span class="sd"> """</span>
+ <span class="n">pid</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">canceller</span><span class="p">(</span><span class="n">_d</span><span class="p">):</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">(</span><span class="n">canceller</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">succeed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
+ <span class="sd">"""Succeeds the Deferred identified by the given unique id with the given</span>
+<span class="sd"> response.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> pid (str): A unique id of a Deferred created with _DeferredMgr.create()</span>
+<span class="sd"> value (mixed): The value to succeed the Deferred with</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">pid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">fail</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
+ <span class="sd">"""Fail the Deferred identified by the given unique id with the given</span>
+<span class="sd"> reason.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> reason (Exception): The reason to fail the Deferred with</span>
+<span class="sd"> pid (str): A unique id of a Deferred created with _DeferredMgr.create()</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">pid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">failAll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">):</span>
+ <span class="sd">"""Fail all Deferred for which predicate(data) returns true.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> reason (Exception): The reason to fail the Deferred with</span>
+<span class="sd"> predicate (function): A predicate</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">pid</span><span class="p">,</span> <span class="n">info</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">predicate</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">info</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+ <span class="n">info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">_CallbackMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="n">first</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">first</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)]</span> <span class="o">=</span> <span class="n">cb</span>
+ <span class="k">return</span> <span class="n">first</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="ow">or</span> <span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="c1">#_printArgs('_CallbackMgr.fire', key, args)</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">cb</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">predicate</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="k">if</span> <span class="n">predicate</span><span class="p">(</span><span class="n">key</span><span class="p">)]</span>
+
+
+<span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+
+ <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">protocol</span><span class="p">:</span> <span class="n">_Protocol</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="n">protocol</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+ <span class="c1"># reestablish existing callbacks by calls to supcon.Remote.on</span>
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">keys</span><span class="p">(</span><span class="k">lambda</span> <span class="n">key</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'on'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
+ <span class="s1">'event'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+ <span class="p">})</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'node'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">setNode</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'node'</span><span class="p">]))</span>
+ <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">__delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+ <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'node {} lost'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} already registered at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">'impl'</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+ <span class="s1">'fire'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="p">}</span>
+ <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intf'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown implementation for interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intfLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'on'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'off'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exceptions</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__callImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call impl: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call impl: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown path'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+ <span class="k">if</span> <span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown intf'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown method'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">d</span>
+
+ <span class="k">def</span> <span class="nf">__callLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+ <span class="s1">'{} is not an method of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'nodes'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">'nodes'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'method {} not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">)))</span>
+
+ <span class="k">def</span> <span class="nf">__callRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call remote: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="c1"># TODO: validate args</span>
+
+ <span class="p">(</span><span class="n">cid</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">create</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">p</span>
+
+ <span class="k">def</span> <span class="nf">__fireImplEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire impl: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire impl: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventRemote</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire local: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="c1">#_printArgs('Node.__fireEventLocal', node, path, intf, event, args)</span>
+
+ <span class="c1"># TODO: validate args</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">fire</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__fireEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire remote: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">nodes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__broadcastEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+ <span class="s1">'{} is not an event of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span>
+
+ <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mesg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="sd">"""Gets called by _Protocol on new Message"""</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'call'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'response'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'event'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">])</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">__recvCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to recv call: method {} of interface {} at path / from node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+ <span class="s1">'{} is not an method of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'node'</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">'node'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+ <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'on'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'event'</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+ <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'off'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'event'</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="n">d</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">),</span>
+ <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__recvError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to recv event: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+ <span class="s1">'{} is not an event of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvEventRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">'intf'</span><span class="p">:</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span>
+ <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+ <span class="k">elif</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">'intfLost'</span><span class="p">:</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span>
+ <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+ <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} lost'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">path</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__sendCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to send call: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'call'</span><span class="p">,</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="n">method</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">args</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'response'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to send event: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">()</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'event'</span><span class="p">,</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="n">event</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">args</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+ <h2 class="section-title" id="header-variables">Module variables</h2>
+ <div class="item">
+ <p id="supcon.core.LocalIntf" class="name">var <span class="ident">LocalIntf</span></p>
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.core.RemoteIntf" class="name">var <span class="ident">RemoteIntf</span></p>
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.core.Node" class="name">class <span class="ident">Node</span></p>
+
+
+ <div class="desc"><p>The Node Interface. This class defines the methods that participants can
+use to access the supcon bus.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+
+ <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">protocol</span><span class="p">:</span> <span class="n">_Protocol</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="n">protocol</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+ <span class="c1"># reestablish existing callbacks by calls to supcon.Remote.on</span>
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">keys</span><span class="p">(</span><span class="k">lambda</span> <span class="n">key</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'on'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
+ <span class="s1">'event'</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+ <span class="p">})</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'node'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">setNode</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'node'</span><span class="p">]))</span>
+ <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">__delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+ <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'node {} lost'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} already registered at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">'impl'</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+ <span class="s1">'fire'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="p">}</span>
+ <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intf'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown implementation for interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+ <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intfLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'on'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'off'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exceptions</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__callImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call impl: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call impl: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown path'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+ <span class="k">if</span> <span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown intf'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown method'</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">d</span>
+
+ <span class="k">def</span> <span class="nf">__callLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+ <span class="s1">'{} is not an method of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'nodes'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">'nodes'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+ <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'method {} not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">)))</span>
+
+ <span class="k">def</span> <span class="nf">__callRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exception</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call remote: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="c1"># TODO: validate args</span>
+
+ <span class="p">(</span><span class="n">cid</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">create</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">p</span>
+
+ <span class="k">def</span> <span class="nf">__fireImplEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire impl: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire impl: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventRemote</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire local: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="c1">#_printArgs('Node.__fireEventLocal', node, path, intf, event, args)</span>
+
+ <span class="c1"># TODO: validate args</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">fire</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__fireEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to fire remote: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">nodes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__broadcastEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+ <span class="s1">'{} is not an event of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span>
+
+ <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mesg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="sd">"""Gets called by _Protocol on new Message"""</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'call'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'response'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'id'</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'event'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">'args'</span><span class="p">])</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">__recvCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to recv call: method {} of interface {} at path / from node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+ <span class="s1">'{} is not an method of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'node'</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">'node'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+ <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'on'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'event'</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+ <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'off'</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">'event'</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="n">d</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">),</span>
+ <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__recvError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to recv event: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+ <span class="s1">'{} is not an event of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__recvEventRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__recvEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">'intf'</span><span class="p">:</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span>
+ <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+ <span class="k">elif</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">'intfLost'</span><span class="p">:</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">'path'</span><span class="p">]</span>
+ <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'intf'</span><span class="p">])</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+ <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} lost'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">path</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} not yet implemented'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__sendCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to send call: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'call'</span><span class="p">,</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="n">method</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">args</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'response'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">'id'</span><span class="p">:</span> <span class="n">cid</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">__sendEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to send event: event {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">()</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'unknown node {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'event'</span><span class="p">,</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+ <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="n">event</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="n">args</span>
+ <span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+ <span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/core.m.md#supcon.core.Node">Node</a></li>
+ <li>supcon.intf.Node</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.core.Node.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: The name of the node on the bus</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+ <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.call">
+ <p>def <span class="ident">call</span>(</p><p>self, node, path, intf, method, args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Calls a method on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ method (str): a method of the given interface
+ args (dict): a dict of method arguments</p>
+<p>Returns:
+ defer.Deferred:</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.call', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.call" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="c1"># TODO: don't raise Exceptions</span>
+ <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">'/'</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+ <span class="s1">'unable to call: method {} of interface {} at path /'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.connect">
+ <p>def <span class="ident">connect</span>(</p><p>self, endpoint)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Connects the node to the given endpoint.</p>
+<p>If the connection failes or closes the connection gets reestablished with an
+exponential timeout up to two minutes.</p>
+<p>Args:
+ endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.connect', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.connect" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.listen">
+ <p>def <span class="ident">listen</span>(</p><p>self, endpoint)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Listens at the given endpoint for incoming connections</p>
+<p>Args:
+ endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.listen', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.listen" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.nodes">
+ <p>def <span class="ident">nodes</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>list[str]: The currently connected nodes</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.nodes', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.nodes" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.off">
+ <p>def <span class="ident">off</span>(</p><p>self, node, path, intf, event, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Unregisters a callback for an event on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.off', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.off" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'off'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.on">
+ <p>def <span class="ident">on</span>(</p><p>self, node, path, intf, event, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers a callback for an event on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.on', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.on" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'on'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">'event'</span><span class="p">:</span> <span class="n">event</span>
+ <span class="p">})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.register">
+ <p>def <span class="ident">register</span>(</p><p>self, path, impl)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers an implementation with the node</p>
+<p>Args:
+ impl (Implementation):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.register', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.register" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} already registered at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">'impl'</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+ <span class="s1">'fire'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="p">}</span>
+ <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intf'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.core.Node.unregister">
+ <p>def <span class="ident">unregister</span>(</p><p>self, path, impl)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Removes an implementation from the node</p>
+<p>Args:
+ impl (supcon.intf.Implementation):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.unregister', this);">Show source ≡</a></p>
+ <div id="source-supcon.core.Node.unregister" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'impl'</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'unknown implementation for interface {} at path {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+ <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">'fire'</span><span class="p">])</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">'intfLost'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'path'</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+
+
+ <li class="set"><h3><a href="/screwerk/supcon/index.md#header-submodules">Sub-modules</a></h3>
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/clone.m.md">supcon.clone</a></li>
+ <li class="mono"><a href="/screwerk/supcon/core.m.md">supcon.core</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md">supcon.intf</a></li>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md">supcon.keyed</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md">supcon.store</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md">supcon.switch</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md">supcon.util</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon</span> module</h1>
+ <p>The <code>supcon</code> Framework provides inter-process communication (IPC) and remote
+procedure call (RPC) mechanisms, that allow communication between multiple
+computer programs running on different hosts in a TCP/IP network.</p>
+<p>Each participating program exposes one or more <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a>s to the
+network. Each <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> has a name that must be unique among the
+nodes of the communicating programs.</p>
+<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">supcon.core</span>
+
+<span class="n">lServer</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">Node</span><span class="p">(</span><span class="s1">'my-unique-server'</span><span class="p">)</span>
+<span class="n">lClient</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">Node</span><span class="p">(</span><span class="s1">'my-unique-client'</span><span class="p">)</span>
+</pre></div>
+
+
+<p>You can give a <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> one or more endpoints on the network to either
+connect to or to listen for incomming connections.</p>
+<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">reactor</span>
+<span class="kn">from</span> <span class="nn">twisted.internet.endpoints</span> <span class="kn">import</span> <span class="n">TCP4ClientEndpoint</span>
+<span class="kn">from</span> <span class="nn">twisted.internet.endpoints</span> <span class="kn">import</span> <span class="n">TCP4ServerEndpoint</span>
+
+<span class="n">lServer</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="n">TCP4ServerEndpoint</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="mi">7000</span><span class="p">))</span>
+<span class="n">lClient</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">TCP4ClientEndpoint</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="s1">'localhost'</span><span class="p">,</span> <span class="mi">7000</span><span class="p">))</span>
+</pre></div>
+
+
+<p>When a <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> is unable to create a connection to the given endpoint
+or an established connection terminates, the node tries to reestablish the
+connection.</p>
+<p>Programs can expose events and provide methods via the node. These events and
+methods are defined in <code>supcon.intf.Interface</code>s. Lets create one:</p>
+<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="n">timerIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Interface</span><span class="p">({</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'com.example.Timer'</span><span class="p">,</span>
+ <span class="s1">'events'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'timeout'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span> <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'timer'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'(str) - The name of the timer'</span> <span class="p">}</span>
+ <span class="p">]</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Gets triggerd, whenever a timer times out.'</span>
+ <span class="p">}</span>
+ <span class="p">],</span>
+ <span class="s1">'methods'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'add'</span><span class="p">,</span>
+ <span class="s1">'inArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span> <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'timer'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'(str) - A name for the timer'</span> <span class="p">}</span>
+ <span class="p">{</span> <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'seconds'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'(float) - A duration'</span> <span class="p">}</span>
+ <span class="p">],</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Adds a new timer.'</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">})</span>
+</pre></div>
+
+
+<p>Lets implement the interface and register the implementation at the local node:</p>
+<div class="codehilite"><pre><span></span><span class="n">timerImpl</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">timerIntf</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">fireTimeout</span><span class="p">(</span><span class="n">timer</span><span class="p">):</span>
+ <span class="n">timerImpl</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'timeout'</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'timer'</span><span class="p">:</span> <span class="n">timer</span> <span class="p">})</span>
+
+<span class="k">def</span> <span class="nf">onAdd</span><span class="p">(</span><span class="n">timer</span><span class="p">,</span> <span class="n">seconds</span><span class="p">):</span>
+ <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">fireTimeout</span><span class="p">(</span><span class="n">timer</span><span class="p">))</span>
+
+<span class="n">timerImpl</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'add'</span><span class="p">,</span> <span class="n">onAdd</span><span class="p">)</span>
+
+<span class="n">lServer</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">'/myTimer'</span><span class="p">,</span> <span class="n">timerImpl</span><span class="p">)</span>
+</pre></div>
+
+
+<p>Now you can watch for timeout events and add a timer via the
+<code>lClient</code> reference:</p>
+<div class="codehilite"><pre><span></span><span class="n">lClient</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="s1">'my-unique-server'</span><span class="p">,</span> <span class="s1">'/myTimer'</span><span class="p">,</span> <span class="s1">'com.example.Timer'</span><span class="p">,</span> <span class="s1">'timeout'</span><span class="p">,</span>
+ <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span> <span class="s1">'{}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">args</span> <span class="p">]))</span>
+<span class="p">)</span>
+
+<span class="n">lClient</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s1">'my-unique-server'</span><span class="p">,</span> <span class="s1">'/myTimer'</span><span class="p">,</span> <span class="s1">'com.example.Timer'</span><span class="p">,</span> <span class="s1">'add'</span><span class="p">,</span> <span class="p">{</span>
+ <span class="s1">'timer'</span><span class="p">:</span> <span class="s1">'5Seconds'</span><span class="p">,</span> <span class="s1">'seconds'</span><span class="p">:</span> <span class="mi">5</span>
+<span class="p">})</span>
+</pre></div>
+
+
+<p>And don't forget to start the reactor (aka event loop)</p>
+<div class="codehilite"><pre><span></span><span class="n">reactor</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+</pre></div>
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon', this);">Show source ≡</a></p>
+ <div id="source-supcon" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">"""</span>
+<span class="sd">The `supcon` Framework provides inter-process communication (IPC) and remote</span>
+<span class="sd">procedure call (RPC) mechanisms, that allow communication between multiple</span>
+<span class="sd">computer programs running on different hosts in a TCP/IP network.</span>
+
+<span class="sd">Each participating program exposes one or more `supcon.intf.Node`s to the</span>
+<span class="sd">network. Each `supcon.intf.Node` has a name that must be unique among the</span>
+<span class="sd">nodes of the communicating programs.</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> import supcon.core</span>
+<span class="sd"> </span>
+<span class="sd"> lServer = supcon.core.Node('my-unique-server')</span>
+<span class="sd"> lClient = supcon.core.Node('my-unique-client')</span>
+
+<span class="sd">You can give a `supcon.intf.Node` one or more endpoints on the network to either</span>
+<span class="sd">connect to or to listen for incomming connections.</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> from twisted.internet import reactor</span>
+<span class="sd"> from twisted.internet.endpoints import TCP4ClientEndpoint</span>
+<span class="sd"> from twisted.internet.endpoints import TCP4ServerEndpoint</span>
+
+<span class="sd"> lServer.listen(TCP4ServerEndpoint(reactor, 7000))</span>
+<span class="sd"> lClient.connect(TCP4ClientEndpoint(reactor, 'localhost', 7000))</span>
+
+<span class="sd">When a `supcon.intf.Node` is unable to create a connection to the given endpoint</span>
+<span class="sd">or an established connection terminates, the node tries to reestablish the</span>
+<span class="sd">connection.</span>
+
+<span class="sd">Programs can expose events and provide methods via the node. These events and</span>
+<span class="sd">methods are defined in `supcon.intf.Interface`s. Lets create one:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> import supcon.intf</span>
+
+<span class="sd"> timerIntf = supcon.intf.Interface({</span>
+<span class="sd"> 'name': 'com.example.Timer',</span>
+<span class="sd"> 'events': [</span>
+<span class="sd"> {</span>
+<span class="sd"> 'name': 'timeout',</span>
+<span class="sd"> 'args': [</span>
+<span class="sd"> { 'name': 'timer', 'description': '(str) - The name of the timer' }</span>
+<span class="sd"> ]</span>
+<span class="sd"> 'description': 'Gets triggerd, whenever a timer times out.'</span>
+<span class="sd"> }</span>
+<span class="sd"> ],</span>
+<span class="sd"> 'methods': [</span>
+<span class="sd"> {</span>
+<span class="sd"> 'name': 'add',</span>
+<span class="sd"> 'inArgs': [</span>
+<span class="sd"> { 'name': 'timer', 'description': '(str) - A name for the timer' }</span>
+<span class="sd"> { 'name': 'seconds', 'description': '(float) - A duration' }</span>
+<span class="sd"> ],</span>
+<span class="sd"> 'description': 'Adds a new timer.'</span>
+<span class="sd"> }</span>
+<span class="sd"> ]</span>
+<span class="sd"> })</span>
+
+<span class="sd">Lets implement the interface and register the implementation at the local node:</span>
+
+<span class="sd"> #!python</span>
+
+<span class="sd"> timerImpl = supcon.intf.Implementation(timerIntf)</span>
+<span class="sd"> </span>
+<span class="sd"> def fireTimeout(timer):</span>
+<span class="sd"> timerImpl.fire('timeout', { 'timer': timer })</span>
+<span class="sd"> </span>
+<span class="sd"> def onAdd(timer, seconds):</span>
+<span class="sd"> reactor.callLater(seconds, lambda: fireTimeout(timer))</span>
+
+<span class="sd"> timerImpl.setCallCb('add', onAdd)</span>
+
+<span class="sd"> lServer.register('/myTimer', timerImpl)</span>
+
+<span class="sd">Now you can watch for timeout events and add a timer via the</span>
+<span class="sd"><code>lClient</code> reference:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> lClient.on('my-unique-server', '/myTimer', 'com.example.Timer', 'timeout', </span>
+<span class="sd"> lambda *args: print(', '.join([ '{}'.format(i) for i in args ]))</span>
+<span class="sd"> )</span>
+
+<span class="sd"> lClient.call('my-unique-server', '/myTimer', 'com.example.Timer', 'add', {</span>
+<span class="sd"> 'timer': '5Seconds', 'seconds': 5</span>
+<span class="sd"> })</span>
+
+<span class="sd">And don't forget to start the reactor (aka event loop)</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> reactor.run()</span>
+
+<span class="sd">"""</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+
+
+ <h2 class="section-title" id="header-submodules">Sub-modules</h2>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/clone.m.md">supcon.clone</a></p>
+
+
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/core.m.md">supcon.core</a></p>
+
+
+ <div class="desc"><p>This module provides the implementation of abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a>.</p></div>
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/intf.m.md">supcon.intf</a></p>
+
+
+ <div class="desc"><p>This module contains the classes to describe interfaces on the supcon bus,
+a base class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation"><code>supcon.intf.Implementation</code></a> to implemet those interfaces and the
+abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> which contains methods to interact with the
+supcon bus.</p></div>
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/keyed.m.md">supcon.keyed</a></p>
+
+
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/store.m.md">supcon.store</a></p>
+
+
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/switch.m.md">supcon.switch</a></p>
+
+
+
+ </div>
+ <div class="item">
+ <p class="name"><a href="/screwerk/supcon/util.m.md">supcon.util</a></p>
+
+
+
+ </div>
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+
+ <li class="set"><h3><a href="/screwerk/supcon/intf.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument">DArgument</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.toDescription">toDescription</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.validate">validate</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments">DArguments</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent">DEvent</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.toDescription">toDescription</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.validateArgs">validateArgs</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents">DEvents</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface">DInterface</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.toDescription">toDescription</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateCall">validateCall</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateEvent">validateEvent</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateReturn">validateReturn</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces">DInterfaces</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod">DMethod</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.toDescription">toDescription</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.validateInArgs">validateInArgs</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.validateOutArgs">validateOutArgs</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods">DMethods</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode">DNode</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.addInterface">addInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.addPath">addPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.delInterface">delInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.delPath">delPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.hasIntf">hasIntf</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.hasPath">hasPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes">DNodes</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addInterface">addInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addNode">addNode</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addPath">addPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delInterface">delInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delNode">delNode</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delPath">delPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasIntf">hasIntf</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasNode">hasNode</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasPath">hasPath</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath">DPath</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.addInterface">addInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.delInterface">delInterface</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.values">values</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation">Implementation</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.addFireCb">addFireCb</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.call">call</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.delFireCb">delFireCb</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.fire">fire</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.setCallCb">setCallCb</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.__init__">__init__</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.toDescription">toDescription</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.__init__">__init__</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node">Node</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.toName">toName</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.call">call</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.connect">connect</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.listen">listen</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.nodes">nodes</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.off">off</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.on">on</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.register">register</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.unregister">unregister</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object">Object</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.implementation">implementation</a></li>
+ <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.interface">interface</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.intf</span> module</h1>
+ <p>This module contains the classes to describe interfaces on the supcon bus,
+a base class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation"><code>Implementation</code></a> to implemet those interfaces and the
+abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>Node</code></a> which contains methods to interact with the
+supcon bus.</p>
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">"""</span>
+<span class="sd">This module contains the classes to describe interfaces on the supcon bus,</span>
+<span class="sd">a base class `supcon.intf.Implementation` to implemet those interfaces and the</span>
+<span class="sd">abstract class `supcon.intf.Node` which contains methods to interact with the</span>
+<span class="sd">supcon bus.</span>
+<span class="sd">"""</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">abc</span>
+<span class="kn">import</span> <span class="nn">itertools</span>
+<span class="kn">import</span> <span class="nn">traceback</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span> <span class="kn">as</span> <span class="nn">defer</span>
+
+<span class="kn">import</span> <span class="nn">supcon.util</span>
+
+<span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Named</span><span class="p">):</span>
+ <span class="sd">"""A base class for objects with a name.</span>
+<span class="sd"> """</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="sd">"""re.RegexObject: a regular expression, the name must conform to"""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: the name"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+
+<span class="k">class</span> <span class="nc">NamedAndDescribed</span><span class="p">(</span><span class="n">Named</span><span class="p">):</span>
+ <span class="sd">"""A base class for the interface describing classes `supcon.intf.Argument`,</span>
+<span class="sd"> `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that</span>
+<span class="sd"> all have the properties name and description."""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> description (str): a description of the argument</span>
+<span class="sd"> """</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: a description"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__description</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DArgument</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""Describes an input or output argument of a `supcon.intf.DMethod` or an</span>
+<span class="sd"> argument of a `supcon.intf.DEvent`"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DArguments</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DArgument` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DArgument</span>
+
+
+<span class="k">class</span> <span class="nc">DEvent</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""Describes an event that can be emitted by an implementation on the bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the event</span>
+<span class="sd"> args (DArguments): the list of arguments of the event</span>
+<span class="sd"> description (str): a description of the event</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">args</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: the list of arguments of the event"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span>
+
+ <span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} has no argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} needs argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'args'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DEvents</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DEvent` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DEvent</span>
+
+
+<span class="k">class</span> <span class="nc">DMethod</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""A DMethod that can be called on an Object on the Bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the method</span>
+<span class="sd"> inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd"> outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd"> description (str): a description of the method</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">inArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: The input arguments of the method"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">outArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: The output arguments of the method"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span>
+
+ <span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'inArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'outArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DMethods</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DMethod` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DMethod</span>
+
+
+<span class="k">class</span> <span class="nc">DInterface</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""An Interface that is implemented by an Object on the Bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'([a-zA-Z0-9_]+</span><span class="se">\\</span><span class="s1">.)*[a-zA-Z0-9_]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the interface</span>
+<span class="sd"> events (DEvents): the list of events of the interface</span>
+<span class="sd"> methods (DMethods): the list of methods of the interface</span>
+<span class="sd"> description (str): a description of the interface</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">events</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DEvents</span><span class="p">:</span>
+ <span class="sd">"""DEvent: the list of events this interface can emit"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">methods</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DMethods</span><span class="p">:</span>
+ <span class="sd">"""DMethods: the list of methods this interface provides"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span>
+
+ <span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates that the given event is an event of this interface and that</span>
+<span class="sd"> the given arguments are arguments of the event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> args (dict): the arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are input arguments of the method</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> inArgs (dict): the input arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are output arguments of the method</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> outArgs (dict): the output arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'events'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'methods'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DInterfaces</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DInterface` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+
+
+<span class="k">class</span> <span class="nc">DPath</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A named readonly map of `supcon.intf.DInterface` instances"""</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> interfaces (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'interfaces'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DNode</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A named readonly map of `supcon.intf.DPath` instances"""</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DPath</span>
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'.+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> paths (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'paths'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DNodes</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DNode` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DNode</span>
+
+ <span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">Implementation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""The base class for interface implementations"""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">intf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: The name of the implemented interface"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">name</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DInterface</span><span class="p">:</span>
+ <span class="sd">"""Interface: The implemented interface"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span>
+
+ <span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd"> interface this Implementation implements. The callback must implement the</span>
+<span class="sd"> given method. The callback gets called by calls to Implementation.call()</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the interface method that the callback implements</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is already set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Interface has no method {}!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls the given interface method with the given arguments. This method</span>
+<span class="sd"> calls the callback set by Implementation.setCallCb()</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the called interface method</span>
+<span class="sd"> inArgs (Mapping): a map of input arguments</span>
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">outArgs</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is not set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">d</span>
+
+ <span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Fires the given event with the given arguments.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event name</span>
+<span class="sd"> args (collecion.Mapping): the event arguments</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+ <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+
+
+<span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+
+ <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+ <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">interfaces</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">implementations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""The Node Interface. This class defines the methods that participants can</span>
+<span class="sd"> use to access the supcon bus."""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: The name of the node on the bus"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DNodes</span><span class="p">:</span>
+ <span class="sd">"""list[str]: The currently connected nodes"""</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Connects the node to the given endpoint.</span>
+
+<span class="sd"> If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd"> exponential timeout up to two minutes.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Listens at the given endpoint for incoming connections</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Registers an implementation with the node</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> impl (Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Removes an implementation from the node</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> impl (supcon.intf.Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls a method on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> method (str): a method of the given interface</span>
+<span class="sd"> args (dict): a dict of method arguments</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred:</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Registers a callback for an event on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Unregisters a callback for an event on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.intf.DArgument" class="name">class <span class="ident">DArgument</span></p>
+
+
+ <div class="desc"><p>Describes an input or output argument of a <a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod"><code>DMethod</code></a> or an
+argument of a <a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent"><code>DEvent</code></a></p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DArgument</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""Describes an input or output argument of a `supcon.intf.DMethod` or an</span>
+<span class="sd"> argument of a `supcon.intf.DEvent`"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument">DArgument</a></li>
+ <li>supcon.util.Dumpable</li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DArgument.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.toDescription">
+ <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.toDescription', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.toDescription" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DArgument.description" class="name">var <span class="ident">description</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: a description</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DArgument.name" class="name">var <span class="ident">name</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, description='')</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+ name (str): the name of the argument
+ description (str): a description of the argument</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> description (str): a description of the argument</span>
+<span class="sd"> """</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArgument.validate">
+ <p>def <span class="ident">validate</span>(</p><p>self, argument)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Validates the given argument value. Raises an ValueError if validation
+fails.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.validate', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArgument.validate" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DArguments" class="name">class <span class="ident">DArguments</span></p>
+
+
+ <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument"><code>DArgument</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DArguments</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DArgument` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DArgument</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments">DArguments</a></li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DArguments.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DArguments.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DArguments.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DEvent" class="name">class <span class="ident">DEvent</span></p>
+
+
+ <div class="desc"><p>Describes an event that can be emitted by an implementation on the bus</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DEvent</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""Describes an event that can be emitted by an implementation on the bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the event</span>
+<span class="sd"> args (DArguments): the list of arguments of the event</span>
+<span class="sd"> description (str): a description of the event</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">args</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: the list of arguments of the event"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span>
+
+ <span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} has no argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} needs argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'args'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent">DEvent</a></li>
+ <li>supcon.util.Dumpable</li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DEvent.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.toDescription">
+ <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.toDescription', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.toDescription" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DEvent.args" class="name">var <span class="ident">args</span></p>
+
+
+
+
+ <div class="desc"><p>DArguments: the list of arguments of the event</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DEvent.description" class="name">var <span class="ident">description</span></p>
+
+
+
+
+ <div class="desc"><p>str: a description</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DEvent.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, args=supcon.intf.DArguments(), description='')</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+ name (str): the name of the event
+ args (DArguments): the list of arguments of the event
+ description (str): a description of the event</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the event</span>
+<span class="sd"> args (DArguments): the list of arguments of the event</span>
+<span class="sd"> description (str): a description of the event</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'args'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvent.validateArgs">
+ <p>def <span class="ident">validateArgs</span>(</p><p>self, args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Validates the given argument map. Raises an ValueError if validation
+fails.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.validateArgs', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvent.validateArgs" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd"> fails.</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} has no argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} needs argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DEvents" class="name">class <span class="ident">DEvents</span></p>
+
+
+ <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent"><code>DEvent</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DEvents</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DEvent` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DEvent</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents">DEvents</a></li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DEvents.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DEvents.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DEvents.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DInterface" class="name">class <span class="ident">DInterface</span></p>
+
+
+ <div class="desc"><p>An Interface that is implemented by an Object on the Bus</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DInterface</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""An Interface that is implemented by an Object on the Bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'([a-zA-Z0-9_]+</span><span class="se">\\</span><span class="s1">.)*[a-zA-Z0-9_]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the interface</span>
+<span class="sd"> events (DEvents): the list of events of the interface</span>
+<span class="sd"> methods (DMethods): the list of methods of the interface</span>
+<span class="sd"> description (str): a description of the interface</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">events</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DEvents</span><span class="p">:</span>
+ <span class="sd">"""DEvent: the list of events this interface can emit"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">methods</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DMethods</span><span class="p">:</span>
+ <span class="sd">"""DMethods: the list of methods this interface provides"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span>
+
+ <span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates that the given event is an event of this interface and that</span>
+<span class="sd"> the given arguments are arguments of the event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> args (dict): the arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are input arguments of the method</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> inArgs (dict): the input arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are output arguments of the method</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> outArgs (dict): the output arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'events'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'methods'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface">DInterface</a></li>
+ <li>supcon.util.Dumpable</li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DInterface.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.toDescription">
+ <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.toDescription', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.toDescription" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DInterface.description" class="name">var <span class="ident">description</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: a description</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DInterface.events" class="name">var <span class="ident">events</span></p>
+
+
+
+
+ <div class="desc"><p>DEvent: the list of events this interface can emit</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DInterface.methods" class="name">var <span class="ident">methods</span></p>
+
+
+
+
+ <div class="desc"><p>DMethods: the list of methods this interface provides</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DInterface.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, events=supcon.intf.DEvents(), methods=supcon.intf.DMethods(), description='')</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+ name (str): the name of the interface
+ events (DEvents): the list of events of the interface
+ methods (DMethods): the list of methods of the interface
+ description (str): a description of the interface</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the interface</span>
+<span class="sd"> events (DEvents): the list of events of the interface</span>
+<span class="sd"> methods (DMethods): the list of methods of the interface</span>
+<span class="sd"> description (str): a description of the interface</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'events'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'methods'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.validateCall">
+ <p>def <span class="ident">validateCall</span>(</p><p>self, method, inArgs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Asserts that the given method is a method of this interface and that
+the given arguments are input arguments of the method</p>
+<p>Args:
+ event (str): the event
+ inArgs (dict): the input arguments
+Raises:
+ AssertationError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateCall', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.validateCall" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are input arguments of the method</span>
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> inArgs (dict): the input arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.validateEvent">
+ <p>def <span class="ident">validateEvent</span>(</p><p>self, event, args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Validates that the given event is an event of this interface and that
+the given arguments are arguments of the event</p>
+<p>Args:
+ event (str): the event
+ args (dict): the arguments
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateEvent', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.validateEvent" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Validates that the given event is an event of this interface and that</span>
+<span class="sd"> the given arguments are arguments of the event</span>
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> args (dict): the arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'event {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterface.validateReturn">
+ <p>def <span class="ident">validateReturn</span>(</p><p>self, method, outArgs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Asserts that the given method is a method of this interface and that
+the given arguments are output arguments of the method</p>
+<p>Args:
+ event (str): the event
+ outArgs (dict): the output arguments
+Raises:
+ AssertationError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateReturn', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterface.validateReturn" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Asserts that the given method is a method of this interface and that</span>
+<span class="sd"> the given arguments are output arguments of the method</span>
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event</span>
+<span class="sd"> outArgs (dict): the output arguments</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> AssertationError</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} is unknown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DInterfaces" class="name">class <span class="ident">DInterfaces</span></p>
+
+
+ <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface"><code>DInterface</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DInterfaces</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DInterface` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces">DInterfaces</a></li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DInterfaces.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DInterfaces.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DInterfaces.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DMethod" class="name">class <span class="ident">DMethod</span></p>
+
+
+ <div class="desc"><p>A DMethod that can be called on an Object on the Bus</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DMethod</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+ <span class="sd">"""A DMethod that can be called on an Object on the Bus"""</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'[a-zA-Z0-9]+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the method</span>
+<span class="sd"> inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd"> outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd"> description (str): a description of the method</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">inArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: The input arguments of the method"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">outArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DArguments</span><span class="p">:</span>
+ <span class="sd">"""DArguments: The output arguments of the method"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span>
+
+ <span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'inArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'outArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod">DMethod</a></li>
+ <li>supcon.util.Dumpable</li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DMethod.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.toDescription">
+ <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.toDescription', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.toDescription" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DMethod.description" class="name">var <span class="ident">description</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: a description</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DMethod.inArgs" class="name">var <span class="ident">inArgs</span></p>
+
+
+
+
+ <div class="desc"><p>DArguments: The input arguments of the method</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DMethod.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DMethod.outArgs" class="name">var <span class="ident">outArgs</span></p>
+
+
+
+
+ <div class="desc"><p>DArguments: The output arguments of the method</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, inArgs=supcon.intf.DArguments(), outArgs=supcon.intf.DArguments(), description='')</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+ name (str): the name of the method
+ inArgs (DArguments): the list of input arguments of the method
+ outArgs (DArguments): the list of output arguments of the method
+ description (str): a description of the method</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Event</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the method</span>
+<span class="sd"> inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd"> outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd"> description (str): a description of the method</span>
+<span class="sd"> """</span>
+ <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'inArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'outArgs'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
+ <span class="n">data</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+ <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.validateInArgs">
+ <p>def <span class="ident">validateInArgs</span>(</p><p>self, inArgs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Validates the given argument Mapping. Raises an ValueError if validation fails</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.validateInArgs', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.validateInArgs" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs input argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethod.validateOutArgs">
+ <p>def <span class="ident">validateOutArgs</span>(</p><p>self, outArgs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Validates the given argument Mapping. Raises an ValueError if validation fails</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.validateOutArgs', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethod.validateOutArgs" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+ <span class="sd">"""Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd"> """</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} has no output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+ <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'method {} needs output argument {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DMethods" class="name">class <span class="ident">DMethods</span></p>
+
+
+ <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod"><code>DMethod</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DMethods</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DMethod` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DMethod</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods">DMethods</a></li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DMethods.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DMethods.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DMethods.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DNode" class="name">class <span class="ident">DNode</span></p>
+
+
+ <div class="desc"><p>A named readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath"><code>DPath</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DNode</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A named readonly map of `supcon.intf.DPath` instances"""</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DPath</span>
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'.+'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> paths (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'paths'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode">DNode</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DNode.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DNode.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DNode.name" class="name">var <span class="ident">name</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, paths=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the Path instance</p>
+<p>Args:
+ name (str): the name of the argument
+ paths (): ...</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> paths (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.addInterface">
+ <p>def <span class="ident">addInterface</span>(</p><p>self, path, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.addInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.addInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.addPath">
+ <p>def <span class="ident">addPath</span>(</p><p>self, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.addPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.addPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.delInterface">
+ <p>def <span class="ident">delInterface</span>(</p><p>self, path, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.delInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.delInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.delPath">
+ <p>def <span class="ident">delPath</span>(</p><p>self, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.delPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.delPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNode'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'path {} on node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'paths'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.hasIntf">
+ <p>def <span class="ident">hasIntf</span>(</p><p>self, path, intf)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.hasIntf', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.hasIntf" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.hasPath">
+ <p>def <span class="ident">hasPath</span>(</p><p>self, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.hasPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.hasPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNode.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNode.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DNodes" class="name">class <span class="ident">DNodes</span></p>
+
+
+ <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode"><code>DNode</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DNodes</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A readonly map of `supcon.intf.DNode` instances"""</span>
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DNode</span>
+
+ <span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes">DNodes</a></li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DNodes.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.addInterface">
+ <p>def <span class="ident">addInterface</span>(</p><p>self, node, path, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.addInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.addNode">
+ <p>def <span class="ident">addNode</span>(</p><p>self, node)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addNode', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.addNode" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.addPath">
+ <p>def <span class="ident">addPath</span>(</p><p>self, node, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.addPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.delInterface">
+ <p>def <span class="ident">delInterface</span>(</p><p>self, node, path, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.delInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.delNode">
+ <p>def <span class="ident">delNode</span>(</p><p>self, node)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delNode', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.delNode" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} is not empty'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.delPath">
+ <p>def <span class="ident">delPath</span>(</p><p>self, node, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.delPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DNodes'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'node {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+ <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+ <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.hasIntf">
+ <p>def <span class="ident">hasIntf</span>(</p><p>self, node, path, intf)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasIntf', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.hasIntf" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.hasNode">
+ <p>def <span class="ident">hasNode</span>(</p><p>self, node)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasNode', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.hasNode" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.hasPath">
+ <p>def <span class="ident">hasPath</span>(</p><p>self, node, path)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.hasPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DNodes.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DNodes.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.DPath" class="name">class <span class="ident">DPath</span></p>
+
+
+ <div class="desc"><p>A named readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface"><code>DInterface</code></a> instances</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DPath</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+ <span class="sd">"""A named readonly map of `supcon.intf.DInterface` instances"""</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+ <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?'</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> interfaces (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'interfaces'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath">DPath</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>supcon.util.NamedList</li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li>supcon.util.Dumpable</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DPath.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.DPath.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.DPath.name" class="name">var <span class="ident">name</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+ </p>
+
+
+
+ <div class="desc inherited"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, interfaces=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the Path instance</p>
+<p>Args:
+ name (str): the name of the argument
+ interfaces (): ...</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""Initializes the Path instance</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> interfaces (): ...</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.addInterface">
+ <p>def <span class="ident">addInterface</span>(</p><p>self, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.addInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.addInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} already exists'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.delInterface">
+ <p>def <span class="ident">delInterface</span>(</p><p>self, interface)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.delInterface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.delInterface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-></span> <span class="s1">'DPath'</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface {} at path {} does not exist'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+ <span class="s1">'interfaces'</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+ <span class="p">}</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.DPath.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.DPath.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.Implementation" class="name">class <span class="ident">Implementation</span></p>
+
+
+ <div class="desc"><p>The base class for interface implementations</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Implementation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""The base class for interface implementations"""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">intf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: The name of the implemented interface"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">name</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DInterface</span><span class="p">:</span>
+ <span class="sd">"""Interface: The implemented interface"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span>
+
+ <span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd"> interface this Implementation implements. The callback must implement the</span>
+<span class="sd"> given method. The callback gets called by calls to Implementation.call()</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the interface method that the callback implements</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is already set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Interface has no method {}!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls the given interface method with the given arguments. This method</span>
+<span class="sd"> calls the callback set by Implementation.setCallCb()</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the called interface method</span>
+<span class="sd"> inArgs (Mapping): a map of input arguments</span>
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">outArgs</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is not set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">d</span>
+
+ <span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Fires the given event with the given arguments.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event name</span>
+<span class="sd"> args (collecion.Mapping): the event arguments</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+ <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation">Implementation</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.Implementation.interface" class="name">var <span class="ident">interface</span></p>
+
+
+
+
+ <div class="desc"><p>Interface: The implemented interface</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.Implementation.intf" class="name">var <span class="ident">intf</span></p>
+
+
+
+
+ <div class="desc"><p>str: The name of the implemented interface</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, interface)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Args:
+interface (DInterface): the interface that is implemented by this Implementation</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.addFireCb">
+ <p>def <span class="ident">addFireCb</span>(</p><p>self, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Adds a callback that gets called, when this Implementation fires an
+event.</p>
+<p>Args:
+ cb (callable): the callback</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.addFireCb', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.addFireCb" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.call">
+ <p>def <span class="ident">call</span>(</p><p>self, method, inArgs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Calls the given interface method with the given arguments. This method
+calls the callback set by Implementation.setCallCb()</p>
+<p>Args:
+ method (str): the called interface method
+ inArgs (Mapping): a map of input arguments
+Returns:
+ defer.Deferred: Resolves with the result of the called method</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.call', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.call" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls the given interface method with the given arguments. This method</span>
+<span class="sd"> calls the callback set by Implementation.setCallCb()</span>
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the called interface method</span>
+<span class="sd"> inArgs (Mapping): a map of input arguments</span>
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">outArgs</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is not set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">d</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.delFireCb">
+ <p>def <span class="ident">delFireCb</span>(</p><p>self, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Removes a callback that gets called, when this Implementation fires an
+event.</p>
+<p>Args:
+ cb (callable): the callback</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.delFireCb', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.delFireCb" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd"> event.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.fire">
+ <p>def <span class="ident">fire</span>(</p><p>self, event, args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Fires the given event with the given arguments.</p>
+<p>Args:
+ event (str): the event name
+ args (collecion.Mapping): the event arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.fire', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.fire" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""Fires the given event with the given arguments.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> event (str): the event name</span>
+<span class="sd"> args (collecion.Mapping): the event arguments</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+ <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Implementation.setCallCb">
+ <p>def <span class="ident">setCallCb</span>(</p><p>self, method, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Sets a callback for the given method. The method must be a method of the
+interface this Implementation implements. The callback must implement the
+given method. The callback gets called by calls to Implementation.call()</p>
+<p>Args:
+ method (str): the interface method that the callback implements
+ cb (callable): the callback</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.setCallCb', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Implementation.setCallCb" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd"> interface this Implementation implements. The callback must implement the</span>
+<span class="sd"> given method. The callback gets called by calls to Implementation.call()</span>
+<span class="sd"> Args:</span>
+<span class="sd"> method (str): the interface method that the callback implements</span>
+<span class="sd"> cb (callable): the callback</span>
+<span class="sd"> """</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Callback for method {} is already set!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Interface has no method {}!'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.Named" class="name">class <span class="ident">Named</span></p>
+
+
+ <div class="desc"><p>A base class for objects with a name.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Named" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Named</span><span class="p">):</span>
+ <span class="sd">"""A base class for objects with a name.</span>
+<span class="sd"> """</span>
+
+ <span class="n">regex</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="sd">"""re.RegexObject: a regular expression, the name must conform to"""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: the name"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.Named.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="desc"><p>re.RegexObject: a regular expression, the name must conform to</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Named.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Named.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.Named.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Named.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+ name (str): the name of the argument</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Named.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.NamedAndDescribed" class="name">class <span class="ident">NamedAndDescribed</span></p>
+
+
+ <div class="desc"><p>A base class for the interface describing classes <code>supcon.intf.Argument</code>,
+<code>supcon.intf.Event</code>, <code>supcon.intf.Method</code> and <code>supcon.intf.Interface</code> that
+all have the properties name and description.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.NamedAndDescribed" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NamedAndDescribed</span><span class="p">(</span><span class="n">Named</span><span class="p">):</span>
+ <span class="sd">"""A base class for the interface describing classes `supcon.intf.Argument`,</span>
+<span class="sd"> `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that</span>
+<span class="sd"> all have the properties name and description."""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> description (str): a description of the argument</span>
+<span class="sd"> """</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: a description"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__description</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+ <li>supcon.util.Named</li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.intf.NamedAndDescribed.regex" class="name">var <span class="ident">regex</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.NamedAndDescribed.toDescription">
+ <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.toDescription', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.NamedAndDescribed.toDescription" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd"> is raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.NamedAndDescribed.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+ value (any): the value
+Raises:
+ ValueError</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.NamedAndDescribed.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> value (any): the value</span>
+<span class="sd"> Raises:</span>
+<span class="sd"> ValueError</span>
+<span class="sd"> """</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"value {} must match {} fully"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.NamedAndDescribed.description" class="name">var <span class="ident">description</span></p>
+
+
+
+
+ <div class="desc"><p>str: a description</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.NamedAndDescribed.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: the name</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.NamedAndDescribed.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name, description='')</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+ name (str): the name of the argument
+ description (str): a description of the argument</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.NamedAndDescribed.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
+ <span class="sd">"""Initializes the NamedAndDescribed instance</span>
+<span class="sd"> Args:</span>
+<span class="sd"> name (str): the name of the argument</span>
+<span class="sd"> description (str): a description of the argument</span>
+<span class="sd"> """</span>
+ <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.Node" class="name">class <span class="ident">Node</span></p>
+
+
+ <div class="desc"><p>The Node Interface. This class defines the methods that participants can
+use to access the supcon bus.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""The Node Interface. This class defines the methods that participants can</span>
+<span class="sd"> use to access the supcon bus."""</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""str: The name of the node on the bus"""</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DNodes</span><span class="p">:</span>
+ <span class="sd">"""list[str]: The currently connected nodes"""</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Connects the node to the given endpoint.</span>
+
+<span class="sd"> If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd"> exponential timeout up to two minutes.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Listens at the given endpoint for incoming connections</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Registers an implementation with the node</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> impl (Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Removes an implementation from the node</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> impl (supcon.intf.Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls a method on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> method (str): a method of the given interface</span>
+<span class="sd"> args (dict): a dict of method arguments</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred:</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Registers a callback for an event on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Unregisters a callback for an event on the bus</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node">Node</a></li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.toName">
+ <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.toName', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.toName" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.Node.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>str: The name of the node on the bus</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.call">
+ <p>def <span class="ident">call</span>(</p><p>self, node, path, intf, method, args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Calls a method on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ method (str): a method of the given interface
+ args (dict): a dict of method arguments</p>
+<p>Returns:
+ defer.Deferred:</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.call', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.call" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="sd">"""Calls a method on the bus</span>
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> method (str): a method of the given interface</span>
+<span class="sd"> args (dict): a dict of method arguments</span>
+<span class="sd"> Returns:</span>
+<span class="sd"> defer.Deferred:</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.connect">
+ <p>def <span class="ident">connect</span>(</p><p>self, endpoint)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Connects the node to the given endpoint.</p>
+<p>If the connection failes or closes the connection gets reestablished with an
+exponential timeout up to two minutes.</p>
+<p>Args:
+ endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.connect', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.connect" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Connects the node to the given endpoint.</span>
+<span class="sd"> If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd"> exponential timeout up to two minutes.</span>
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.listen">
+ <p>def <span class="ident">listen</span>(</p><p>self, endpoint)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Listens at the given endpoint for incoming connections</p>
+<p>Args:
+ endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.listen', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.listen" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+ <span class="sd">"""Listens at the given endpoint for incoming connections</span>
+<span class="sd"> Args:</span>
+<span class="sd"> endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.nodes">
+ <p>def <span class="ident">nodes</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>list[str]: The currently connected nodes</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.nodes', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.nodes" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">DNodes</span><span class="p">:</span>
+ <span class="sd">"""list[str]: The currently connected nodes"""</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.off">
+ <p>def <span class="ident">off</span>(</p><p>self, node, path, intf, event, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Unregisters a callback for an event on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.off', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.off" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Unregisters a callback for an event on the bus</span>
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.on">
+ <p>def <span class="ident">on</span>(</p><p>self, node, path, intf, event, cb)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers a callback for an event on the bus</p>
+<p>Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.on', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.on" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+ <span class="sd">"""Registers a callback for an event on the bus</span>
+<span class="sd"> Args:</span>
+<span class="sd"> node (str): a node on the bus</span>
+<span class="sd"> path (str): a path on the given node</span>
+<span class="sd"> intf (str): an interface at the given path</span>
+<span class="sd"> event (str): a method of the given interface</span>
+<span class="sd"> cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.register">
+ <p>def <span class="ident">register</span>(</p><p>self, path, impl)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers an implementation with the node</p>
+<p>Args:
+ impl (Implementation):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.register', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.register" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Registers an implementation with the node</span>
+<span class="sd"> Args:</span>
+<span class="sd"> impl (Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Node.unregister">
+ <p>def <span class="ident">unregister</span>(</p><p>self, path, impl)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Removes an implementation from the node</p>
+<p>Args:
+ impl (supcon.intf.Implementation):</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.unregister', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Node.unregister" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+ <span class="sd">"""Removes an implementation from the node</span>
+<span class="sd"> Args:</span>
+<span class="sd"> impl (supcon.intf.Implementation):</span>
+<span class="sd"> """</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.intf.Object" class="name">class <span class="ident">Object</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Object" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+
+ <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+ <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">interfaces</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">implementations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object">Object</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.intf.Object.implementations" class="name">var <span class="ident">implementations</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.intf.Object.interfaces" class="name">var <span class="ident">interfaces</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Object.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, interfaces=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Args:
+interfaces (DInterfaces): the interfaces that are implemented by this Object</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Object.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Args:</span>
+<span class="sd"> interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'interface must be an instance of {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+ <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+ <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+ <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Object.implementation">
+ <p>def <span class="ident">implementation</span>(</p><p>self, intf)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.implementation', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Object.implementation" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.intf.Object.interface">
+ <p>def <span class="ident">interface</span>(</p><p>self, intf)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.interface', this);">Show source ≡</a></p>
+ <div id="source-supcon.intf.Object.interface" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+ <li class="set"><h3><a href="/screwerk/supcon/keyed.m.md#header-functions">Functions</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.callKeyedMethod">callKeyedMethod</a></li>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.iKeyedMethods">iKeyedMethods</a></li>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.keyedMethod">keyedMethod</a></li>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.lKeyedMethods">lKeyedMethods</a></li>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.mKeyedMethods">mKeyedMethods</a></li>
+ </ul>
+
+ </li>
+
+ <li class="set"><h3><a href="/screwerk/supcon/keyed.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod">KeyedMethod</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod.__init__">__init__</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.keyed</span> module</h1>
+
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed" class="source">
+ <div class="codehilite"><pre><span></span><span class="n">lass</span> <span class="n">KeyedMethod</span><span class="p">():</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+ <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__key</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span>
+ <span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objType</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">"unreadable attribute"</span><span class="p">)</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict does not contain the KeyedMethods of any super class.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">aClass</span> <span class="ow">is</span> <span class="nb">object</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">{}</span>
+ <span class="n">lAttrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_lKeyedMethods'</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="p">:</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">KeyedMethod</span><span class="p">):</span>
+ <span class="n">methods</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span>
+<span class="n">ef</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict contains the KeyedMethods of all super classes that are not</span>
+<span class="sd"> hidden by the method resolution order.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_mKeyedMethods'</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">sClass</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">aClass</span><span class="o">.</span><span class="n">mro</span><span class="p">()):</span>
+ <span class="n">methods</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">sClass</span><span class="p">))</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span>
+<span class="n">ef</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by key. The dict</span>
+<span class="sd"> contains the KeyedMethods of all super classes that are not hidden by the</span>
+<span class="sd"> method resolution order.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_iKeyedMethods'</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">_name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
+ <span class="n">methods</span><span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span>
+<span class="n">ef</span> <span class="n">keyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Can be used to decorate a method with a key</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">fget</span><span class="p">:</span> <span class="n">KeyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">callKeyedMethod</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Resolves a keyed method by the given key and and calls it with the given</span>
+<span class="sd"> arguments.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">))[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">obj</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+ <h2 class="section-title" id="header-functions">Functions</h2>
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.callKeyedMethod">
+ <p>def <span class="ident">callKeyedMethod</span>(</p><p>obj, key, *args, **kwargs)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Resolves a keyed method by the given key and and calls it with the given
+arguments.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.callKeyedMethod', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.callKeyedMethod" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">callKeyedMethod</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Resolves a keyed method by the given key and and calls it with the given</span>
+<span class="sd"> arguments.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">))[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">obj</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.iKeyedMethods">
+ <p>def <span class="ident">iKeyedMethods</span>(</p><p>aClass)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by key. The dict
+contains the KeyedMethods of all super classes that are not hidden by the
+method resolution order.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.iKeyedMethods', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.iKeyedMethods" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">iKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by key. The dict</span>
+<span class="sd"> contains the KeyedMethods of all super classes that are not hidden by the</span>
+<span class="sd"> method resolution order.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_iKeyedMethods'</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">_name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
+ <span class="n">methods</span><span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.keyedMethod">
+ <p>def <span class="ident">keyedMethod</span>(</p><p>key)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Can be used to decorate a method with a key</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.keyedMethod', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.keyedMethod" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Can be used to decorate a method with a key</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">fget</span><span class="p">:</span> <span class="n">KeyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.lKeyedMethods">
+ <p>def <span class="ident">lKeyedMethods</span>(</p><p>aClass)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by attribute
+name. The dict does not contain the KeyedMethods of any super class.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.lKeyedMethods', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.lKeyedMethods" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">lKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict does not contain the KeyedMethods of any super class.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">aClass</span> <span class="ow">is</span> <span class="nb">object</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">{}</span>
+
+ <span class="n">lAttrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_lKeyedMethods'</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="p">:</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">KeyedMethod</span><span class="p">):</span>
+ <span class="n">methods</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.mKeyedMethods">
+ <p>def <span class="ident">mKeyedMethods</span>(</p><p>aClass)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by attribute
+name. The dict contains the KeyedMethods of all super classes that are not
+hidden by the method resolution order.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.mKeyedMethods', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.mKeyedMethods" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict contains the KeyedMethods of all super classes that are not</span>
+<span class="sd"> hidden by the method resolution order.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">'_mKeyedMethods'</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">sClass</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">aClass</span><span class="o">.</span><span class="n">mro</span><span class="p">()):</span>
+ <span class="n">methods</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">sClass</span><span class="p">))</span>
+ <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.keyed.KeyedMethod" class="name">class <span class="ident">KeyedMethod</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.KeyedMethod', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.KeyedMethod" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">KeyedMethod</span><span class="p">():</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+ <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__key</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span>
+
+ <span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objType</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">"unreadable attribute"</span><span class="p">)</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod">KeyedMethod</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.keyed.KeyedMethod.fget" class="name">var <span class="ident">fget</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.keyed.KeyedMethod.key" class="name">var <span class="ident">key</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.keyed.KeyedMethod.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, key, fget)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.KeyedMethod.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.keyed.KeyedMethod.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+ <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+ <li class="set"><h3><a href="/screwerk/supcon/store.m.md#header-functions">Functions</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.readFile">readFile</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.writeFile">writeFile</a></li>
+ </ul>
+
+ </li>
+
+ <li class="set"><h3><a href="/screwerk/supcon/store.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore">FileStore</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.delete">delete</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.store">store</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.delete">delete</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.store">store</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.store</span> module</h1>
+
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store', this);">Show source ≡</a></p>
+ <div id="source-supcon.store" class="source">
+ <div class="codehilite"><pre><span></span><span class="n">mport</span> <span class="n">msgpack</span>
+<span class="n">mport</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span> <span class="k">as</span> <span class="n">defer</span>
+<span class="n">mport</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">threads</span> <span class="k">as</span> <span class="n">threads</span>
+<span class="n">lass</span> <span class="n">Store</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+<span class="n">ef</span> <span class="n">readFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'readFile'</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'readFile > inThread'</span><span class="p">)</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">'r+b'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">writeFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'writeFile'</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'writeFile > inThread'</span><span class="p">)</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">'w+b'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+<span class="n">lass</span> <span class="n">FileStore</span><span class="p">(</span><span class="n">Store</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+ <span class="nd">@defer.inlineCallbacks</span>
+ <span class="k">def</span> <span class="nf">__readData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">readFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+ <span class="k">def</span> <span class="nf">__queue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
+ <span class="k">def</span> <span class="nf">trampolineSucceed</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">trampolineFail</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addBoth</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">job</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">d</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+ <h2 class="section-title" id="header-functions">Functions</h2>
+
+ <div class="item">
+ <div class="name def" id="supcon.store.readFile">
+ <p>def <span class="ident">readFile</span>(</p><p>name)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.readFile', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.readFile" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">readFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'readFile'</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'readFile > inThread'</span><span class="p">)</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">'r+b'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.writeFile">
+ <p>def <span class="ident">writeFile</span>(</p><p>name, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.writeFile', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.writeFile" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">writeFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'writeFile'</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">'writeFile > inThread'</span><span class="p">)</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">'w+b'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.store.FileStore" class="name">class <span class="ident">FileStore</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.FileStore" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">FileStore</span><span class="p">(</span><span class="n">Store</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+
+ <span class="nd">@defer.inlineCallbacks</span>
+ <span class="k">def</span> <span class="nf">__readData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">readFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="n">data</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+ <span class="k">def</span> <span class="nf">__queue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">trampolineSucceed</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">trampolineFail</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addBoth</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">job</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">d</span>
+
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore">FileStore</a></li>
+ <li><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.store.FileStore.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.store.FileStore.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.FileStore.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.FileStore.delete">
+ <p>def <span class="ident">delete</span>(</p><p>self, key)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.delete', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.FileStore.delete" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.FileStore.load">
+ <p>def <span class="ident">load</span>(</p><p>self, key)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.FileStore.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.FileStore.store">
+ <p>def <span class="ident">store</span>(</p><p>self, key, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.store', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.FileStore.store" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.store.Store" class="name">class <span class="ident">Store</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.Store" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Store</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.store.Store.delete">
+ <p>def <span class="ident">delete</span>(</p><p>self, key)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.delete', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.Store.delete" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.Store.load">
+ <p>def <span class="ident">load</span>(</p><p>self, key)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.Store.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.store.Store.store">
+ <p>def <span class="ident">store</span>(</p><p>self, key, data)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.store', this);">Show source ≡</a></p>
+ <div id="source-supcon.store.Store.store" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+ <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-variables">Module variables</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SensorIntf">SensorIntf</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SwitchIntf">SwitchIntf</a></li>
+ </ul>
+
+ </li>
+
+ <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-functions">Functions</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnFirst">returnFirst</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnNone">returnNone</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnTrue">returnTrue</a></li>
+ </ul>
+
+ </li>
+
+ <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor">NodeSensor</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.emit">emit</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.off">off</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.on">on</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor">PiGPIOSensor</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor.__init__">__init__</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch">PiGPIOSwitch</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch.update">update</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.update">update</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.update">update</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.switch</span> module</h1>
+
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">pigpio</span>
+<span class="kn">import</span> <span class="nn">supcon.util</span>
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="sd">""" the interface com.screwerk.Sensor """</span>
+<span class="n">SensorIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+ <span class="s1">'name'</span><span class="p">:</span>
+ <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span>
+ <span class="s1">'events'</span><span class="p">:</span> <span class="p">[{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'changed'</span><span class="p">,</span>
+ <span class="s1">'args'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'value'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The new sensor value'</span>
+ <span class="p">}</span>
+ <span class="p">],</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Fires when the sensor value changes'</span>
+ <span class="p">}],</span>
+ <span class="s1">'methods'</span><span class="p">:</span> <span class="p">[{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'value'</span><span class="p">,</span>
+ <span class="s1">'outArgs'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'value'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'The sensor value'</span>
+ <span class="p">}</span>
+ <span class="p">],</span>
+ <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Returns the sensor value'</span>
+ <span class="p">}]</span>
+<span class="p">})</span>
+
+<span class="sd">""" the interface com.screwerk.Switch """</span>
+<span class="n">SwitchIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'com.screwerk.Switch'</span><span class="p">,</span>
+ <span class="s1">'methods'</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'on'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Toggles the switch on'</span>
+ <span class="p">},</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'off'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Toggles the switch off'</span>
+ <span class="p">},</span> <span class="p">{</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'toggle'</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Toggles the switch'</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">})</span>
+
+
+<span class="k">def</span> <span class="nf">returnTrue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span>
+<span class="k">def</span> <span class="nf">returnNone</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">None</span>
+<span class="k">def</span> <span class="nf">returnFirst</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">SoftSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+ <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+
+<span class="k">class</span> <span class="nc">SoftSwitch</span><span class="p">(</span><span class="n">SoftSensor</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+ <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+
+ <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'on'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'off'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'toggle'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">switch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span>
+
+
+<span class="k">class</span> <span class="nc">PiGPIOSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+ <span class="k">def</span> <span class="nf">__callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">tick</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">level</span> <span class="o">>=</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span><span class="o">.</span><span class="n">callFromThread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">,</span> <span class="nb">bool</span><span class="p">(</span><span class="n">level</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+
+<span class="k">class</span> <span class="nc">PiGPIOSwitch</span><span class="p">(</span><span class="n">SoftSwitch</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+ <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+ <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">NodeSensor</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.com'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__node</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__path</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+ <span class="k">def</span> <span class="nf">__fetchValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'value'</span><span class="p">]),</span>
+ <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__onIntfLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'value'</span><span class="p">])</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+ <h2 class="section-title" id="header-variables">Module variables</h2>
+ <div class="item">
+ <p id="supcon.switch.SensorIntf" class="name">var <span class="ident">SensorIntf</span></p>
+
+
+ <div class="desc"><p>the interface com.screwerk.Switch</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.SwitchIntf" class="name">var <span class="ident">SwitchIntf</span></p>
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+
+ <h2 class="section-title" id="header-functions">Functions</h2>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.returnFirst">
+ <p>def <span class="ident">returnFirst</span>(</p><p>*args)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnFirst', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.returnFirst" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnFirst</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.returnNone">
+ <p>def <span class="ident">returnNone</span>(</p><p>*args)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnNone', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.returnNone" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnNone</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">None</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.returnTrue">
+ <p>def <span class="ident">returnTrue</span>(</p><p>*args)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnTrue', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.returnTrue" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnTrue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.switch.NodeSensor" class="name">class <span class="ident">NodeSensor</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.NodeSensor" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NodeSensor</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.com'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__node</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__path</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+ <span class="k">def</span> <span class="nf">__fetchValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'value'</span><span class="p">]),</span>
+ <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__onIntfLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">'value'</span><span class="p">])</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor">NodeSensor</a></li>
+ <li>supcon.util.EventEmitter</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.switch.NodeSensor.node" class="name">var <span class="ident">node</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.NodeSensor.path" class="name">var <span class="ident">path</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.NodeSensor.value" class="name">var <span class="ident">value</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.NodeSensor.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, local, node, path)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.NodeSensor.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intf'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'supcon.Local'</span><span class="p">,</span> <span class="s1">'intfLost'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.Sensor'</span><span class="p">,</span> <span class="s1">'changed'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">'com.screwerk.com'</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.NodeSensor.emit">
+ <p>def <span class="ident">emit</span>(</p><p>self, event, *args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Calls all callbacks for the given event with the given arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.emit', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.NodeSensor.emit" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Calls all callbacks for the given event with the given arguments</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.NodeSensor.off">
+ <p>def <span class="ident">off</span>(</p><p>self, event, callback)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Unregisters the given callback for the given event</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.off', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.NodeSensor.off" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unregisters the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+ <span class="k">return</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.NodeSensor.on">
+ <p>def <span class="ident">on</span>(</p><p>self, event, callback)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers the given callback for the given event</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.on', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.NodeSensor.on" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Registers the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+ <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSensor" class="name">class <span class="ident">PiGPIOSensor</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSensor', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.PiGPIOSensor" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PiGPIOSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+ <span class="k">def</span> <span class="nf">__callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">tick</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">level</span> <span class="o">>=</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span><span class="o">.</span><span class="n">callFromThread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">,</span> <span class="nb">bool</span><span class="p">(</span><span class="n">level</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor">PiGPIOSensor</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSensor.sensor" class="name">var <span class="ident">sensor</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.PiGPIOSensor.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, reactor, gpio)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSensor.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.PiGPIOSensor.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSwitch" class="name">class <span class="ident">PiGPIOSwitch</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.PiGPIOSwitch" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PiGPIOSwitch</span><span class="p">(</span><span class="n">SoftSwitch</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+ <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+ <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch">PiGPIOSwitch</a></li>
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></li>
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSwitch.sensor" class="name">var <span class="ident">sensor</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></code>.<code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.sensor">sensor</a></code>
+ </p>
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSwitch.switch" class="name">var <span class="ident">switch</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.PiGPIOSwitch.value" class="name">var <span class="ident">value</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.PiGPIOSwitch.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, gpio, guard=None, effect=None, convert=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.PiGPIOSwitch.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+ <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+ <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.PiGPIOSwitch.update">
+ <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch.update', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.PiGPIOSwitch.update" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.switch.SoftSensor" class="name">class <span class="ident">SoftSensor</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSensor" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SoftSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+ <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.switch.SoftSensor.sensor" class="name">var <span class="ident">sensor</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.SoftSensor.value" class="name">var <span class="ident">value</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.SoftSensor.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, value=None, guard=None, effect=None, convert=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSensor.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.SoftSensor.update">
+ <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor.update', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSensor.update" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.switch.SoftSwitch" class="name">class <span class="ident">SoftSwitch</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSwitch" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SoftSwitch</span><span class="p">(</span><span class="n">SoftSensor</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+ <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+
+ <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'on'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'off'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'toggle'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">switch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></li>
+ <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.switch.SoftSwitch.sensor" class="name">var <span class="ident">sensor</span></p>
+
+ <p class="inheritance">
+ <strong>Inheritance:</strong>
+ <code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></code>.<code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.sensor">sensor</a></code>
+ </p>
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.SoftSwitch.switch" class="name">var <span class="ident">switch</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <div class="item">
+ <p id="supcon.switch.SoftSwitch.value" class="name">var <span class="ident">value</span></p>
+
+
+
+
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.SoftSwitch.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, value=False, guard=None, effect=None, convert=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSwitch.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+ <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+ <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'on'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'off'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">'toggle'</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.switch.SoftSwitch.update">
+ <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch.update', this);">Show source ≡</a></p>
+ <div id="source-supcon.switch.SoftSwitch.update" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">'changed'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+ <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+ .CONTENT {
+ padding: 0;
+ }
+
+ #container {
+ display: flex;
+ flex-directtion: column;
+ }
+
+ #content {
+ padding: 30px;
+ border-left: 1px solid #ddd;
+ }
+ #sidebar {
+ padding: 30px;
+ }
+
+ #footer {
+ font-size: .75em;
+ padding: 5px 30px;
+ border-top: 1px solid #ddd;
+ text-align: right;
+ }
+ #footer p {
+ margin: 0 0 0 30px;
+ display: inline-block;
+ }
+
+ h1, h2, h3, h4, h5 {
+ font-weight: 300;
+ }
+ h1 {
+ font-size: 2.5em;
+ line-height: 1.1em;
+ margin: 0 0 .50em 0;
+ }
+
+ h2 {
+ font-size: 1.75em;
+ margin: 1em 0 .50em 0;
+ }
+
+ h3 {
+ margin: 25px 0 10px 0;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 105%;
+ }
+
+ a {
+ color: #058;
+ text-decoration: none;
+ transition: color .3s ease-in-out;
+ }
+
+ a:hover {
+ color: #e08524;
+ transition: color .3s ease-in-out;
+ }
+
+ pre, code, .mono, .name {
+ font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+ }
+
+ .title .name {
+ font-weight: bold;
+ }
+ .section-title {
+ margin-top: 2em;
+ }
+ .ident {
+ color: #900;
+ }
+
+ code {
+ background: #f9f9f9;
+ }
+
+ pre {
+ background: #fefefe;
+ border: 1px solid #ddd;
+ box-shadow: 2px 2px 0 #f3f3f3;
+ margin: 0 30px;
+ padding: 15px 30px;
+ }
+
+ .codehilite {
+ margin: 0 30px 10px 30px;
+ }
+
+ .codehilite pre {
+ margin: 0;
+ }
+ .codehilite .err { background: #ff3300; color: #fff !important; }
+
+ table#module-list {
+ font-size: 110%;
+ }
+
+ table#module-list tr td:first-child {
+ padding-right: 10px;
+ white-space: nowrap;
+ }
+
+ table#module-list td {
+ vertical-align: top;
+ padding-bottom: 8px;
+ }
+
+ table#module-list td p {
+ margin: 0 0 7px 0;
+ }
+
+ .def {
+ display: table;
+ }
+
+ .def p {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ }
+
+ .def p:first-child {
+ white-space: nowrap;
+ }
+
+ .def p:last-child {
+ width: 100%;
+ }
+
+
+ #index {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul#index .class_name {
+ /* font-size: 110%; */
+ font-weight: bold;
+ }
+ #index ul {
+ margin: 0;
+ }
+
+ .item {
+ margin: 0 0 15px 0;
+ }
+
+ .item .class {
+ margin: 0 0 25px 30px;
+ }
+
+ .item .class ul.class_list {
+ margin: 0 0 20px 0;
+ }
+
+ .item .name {
+ background: #fafafa;
+ margin: 0;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 3px;
+ display: inline-block;
+ min-width: 40%;
+ }
+ .item .name:hover {
+ background: #f6f6f6;
+ }
+
+ .item .empty_desc {
+ margin: 0 0 5px 0;
+ padding: 0;
+ }
+
+ .item .inheritance {
+ margin: 3px 0 0 30px;
+ }
+
+ .item .inherited {
+ color: #666;
+ }
+
+ .item .desc {
+ padding: 0 8px;
+ margin: 0;
+ }
+
+ .item .desc p {
+ margin: 0 0 10px 0;
+ }
+
+ .source_cont {
+ margin: 0;
+ padding: 0;
+ }
+
+ .source_link a {
+ background: #ffc300;
+ font-weight: 400;
+ font-size: .75em;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: 1px 1px 0 #f4b700;
+
+ padding: 3px 8px;
+ border-radius: 2px;
+ transition: background .3s ease-in-out;
+ }
+ .source_link a:hover {
+ background: #FF7200;
+ text-shadow: none;
+ transition: background .3s ease-in-out;
+ }
+
+ .source {
+ display: none;
+ max-height: 600px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+ }
+
+ .source .codehilite {
+ margin: 0;
+ }
+
+ .desc h1, .desc h2, .desc h3 {
+ font-size: 100% !important;
+ }
+ .clear {
+ clear: both;
+ }
+
+ @media all and (max-width: 950px) {
+ #sidebar {
+ width: 35%;
+ }
+ #content {
+ width: 65%;
+ }
+ }
+ @media all and (max-width: 650px) {
+ #top {
+ display: none;
+ }
+ #sidebar {
+ float: none;
+ width: auto;
+ }
+ #content {
+ float: none;
+ width: auto;
+ padding: 30px;
+ }
+
+ #index ul {
+ padding: 0;
+ margin-bottom: 15px;
+ }
+ #index ul li {
+ display: inline-block;
+ margin-right: 30px;
+ }
+ #footer {
+ text-align: left;
+ }
+ #footer p {
+ display: block;
+ margin: inherit;
+ }
+ }
+
+ /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+ $node = document.getElementById(id);
+ if (!$node) return;
+ if (!$node.style.display || $node.style.display == 'none') {
+ $node.style.display = 'block';
+ $link.innerHTML = 'Hide source ≢';
+ } else {
+ $node.style.display = 'none';
+ $link.innerHTML = 'Show source ≡';
+ }
+}
+</script>
+
+<div id="container">
+
+
+ <div id="sidebar">
+ <a href="/screwerk/supcon">Doc</a>
+
+ <h1>Index</h1>
+ <ul id="index">
+
+ <li class="set"><h3><a href="/screwerk/supcon/util.m.md#header-functions">Functions</a></h3>
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.schedule">schedule</a></li>
+ </ul>
+
+ </li>
+
+ <li class="set"><h3><a href="/screwerk/supcon/util.m.md#header-classes">Classes</a></h3>
+ <ul>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable.dump">dump</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter">EventEmitter</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.emit">emit</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.off">off</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.on">on</a></li>
+ </ul>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.Named">Named</a></span>
+
+ </li>
+ <li class="mono">
+ <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList">NamedList</a></span>
+
+
+ <ul>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.load">load</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.to">to</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.__init__">__init__</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.dump">dump</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.get">get</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.items">items</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.keys">keys</a></li>
+ <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.values">values</a></li>
+ </ul>
+
+ </li>
+ </ul>
+ </li>
+
+ </ul>
+ </div>
+
+ <article id="content">
+
+
+
+
+
+
+ <header id="section-intro">
+ <h1 class="title"><span class="name">supcon.util</span> module</h1>
+
+
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util', this);">Show source ≡</a></p>
+ <div id="source-supcon.util" class="source">
+ <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">abc</span>
+
+<span class="kn">import</span> <span class="nn">asyncio</span>
+<span class="kn">import</span> <span class="nn">collections</span>
+<span class="kn">import</span> <span class="nn">collections.abc</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span>
+
+<span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">iscoroutine</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="n">obj</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span><span class="o">.</span><span class="n">ensureDeferred</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">obj</span>
+
+<span class="k">class</span> <span class="nc">Dumpable</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The abstract base class `supcon.util.Dumpable`.</span>
+
+<span class="sd"> Implementations of this abstract base class can be converted to and from</span>
+<span class="sd"> 'simple' datastructures containing only ints, floats, strings, lists and</span>
+<span class="sd"> dicts. These simple datastructures can be send and received by the supcon</span>
+<span class="sd"> bus. If you only ever use simple datastructures you can ignore this class.</span>
+<span class="sd"> """</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.Dumpable` into a 'simple' datastructure.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abc.abstractclassmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given 'simple' datastructure **data** into an instance of</span>
+<span class="sd"> **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The abstract base class `supcon.util.Named`.</span>
+
+<span class="sd"> Implementations of this abstract base class must have a property</span>
+<span class="sd"> `supcon.util.Named.name`, that can be used as a key in a dictionary.</span>
+<span class="sd"> """</span>
+
+ <span class="nd">@property</span>
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The name of the instance. Is useable as a dictionary key.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">NamedList</span><span class="p">(</span><span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Mapping</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> A `supcon.util.NamedList` is an ordered, readonly dictionary of</span>
+<span class="sd"> `supcon.util.Named` and `supcon.util.Dumpable` elements of value type</span>
+<span class="sd"> `supcon.util.NamedList.vtype`.</span>
+
+<span class="sd"> The class `supcon.util.NamedList` itself can not be instantiated. It must be</span>
+<span class="sd"> subclassed and the class property `supcon.util.NamedList.vtype` set. The class</span>
+<span class="sd"> property `supcon.util.NamedList.vtype` denotes the type of the elements that</span>
+<span class="sd"> the list can contain. The type `supcon.util.NamedList.vtype` must be a</span>
+<span class="sd"> subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the</span>
+<span class="sd"> `supcon.util.NamedList.vtype` can be accessed by the values of their</span>
+<span class="sd"> `supcon.util.Named.name` property.</span>
+<span class="sd"> """</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="sd">"""</span>
+<span class="sd"> Must be assigned in a subclass of `supcon.util.NamedList` to a subclass</span>
+<span class="sd"> of `supcon.util.Named` and `supcon.util.Dumpable`</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">"{}.{}({})"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
+ <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">EventEmitter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Registers the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+ <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unregisters the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+ <span class="k">return</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+
+ <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Calls all callbacks for the given event with the given arguments</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+
+ </header>
+
+ <section id="section-items">
+
+ <h2 class="section-title" id="header-functions">Functions</h2>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.schedule">
+ <p>def <span class="ident">schedule</span>(</p><p>obj)</p>
+ </div>
+
+
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.schedule', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.schedule" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">iscoroutine</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="n">obj</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span><span class="o">.</span><span class="n">ensureDeferred</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">obj</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <h2 class="section-title" id="header-classes">Classes</h2>
+
+ <div class="item">
+ <p id="supcon.util.Dumpable" class="name">class <span class="ident">Dumpable</span></p>
+
+
+ <div class="desc"><p>The abstract base class <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a>.</p>
+<p>Implementations of this abstract base class can be converted to and from
+'simple' datastructures containing only ints, floats, strings, lists and
+dicts. These simple datastructures can be send and received by the supcon
+bus. If you only ever use simple datastructures you can ignore this class.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.Dumpable" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Dumpable</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The abstract base class `supcon.util.Dumpable`.</span>
+
+<span class="sd"> Implementations of this abstract base class can be converted to and from</span>
+<span class="sd"> 'simple' datastructures containing only ints, floats, strings, lists and</span>
+<span class="sd"> dicts. These simple datastructures can be send and received by the supcon</span>
+<span class="sd"> bus. If you only ever use simple datastructures you can ignore this class.</span>
+<span class="sd"> """</span>
+
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.Dumpable` into a 'simple' datastructure.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abc.abstractclassmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given 'simple' datastructure **data** into an instance of</span>
+<span class="sd"> **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.Dumpable.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given 'simple' datastructure <strong>data</strong> into an instance of
+<strong>cls</strong>, a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a></p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.Dumpable.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractclassmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given 'simple' datastructure **data** into an instance of</span>
+<span class="sd"> **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.Dumpable.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a> into a 'simple' datastructure.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.Dumpable.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.Dumpable` into a 'simple' datastructure.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.util.EventEmitter" class="name">class <span class="ident">EventEmitter</span></p>
+
+
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.EventEmitter" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">EventEmitter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Registers the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+ <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unregisters the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+ <span class="k">return</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+
+ <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Calls all callbacks for the given event with the given arguments</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter">EventEmitter</a></li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.EventEmitter.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initialize self. See help(type(self)) for accurate signature.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.EventEmitter.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.EventEmitter.emit">
+ <p>def <span class="ident">emit</span>(</p><p>self, event, *args)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Calls all callbacks for the given event with the given arguments</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.emit', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.EventEmitter.emit" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Calls all callbacks for the given event with the given arguments</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.EventEmitter.off">
+ <p>def <span class="ident">off</span>(</p><p>self, event, callback)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Unregisters the given callback for the given event</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.off', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.EventEmitter.off" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unregisters the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+ <span class="k">return</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.EventEmitter.on">
+ <p>def <span class="ident">on</span>(</p><p>self, event, callback)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Registers the given callback for the given event</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.on', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.EventEmitter.on" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Registers the given callback for the given event</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+ <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.util.Named" class="name">class <span class="ident">Named</span></p>
+
+
+ <div class="desc"><p>The abstract base class <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a>.</p>
+<p>Implementations of this abstract base class must have a property
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named.name"><code>name</code></a>, that can be used as a key in a dictionary.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Named', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.Named" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The abstract base class `supcon.util.Named`.</span>
+
+<span class="sd"> Implementations of this abstract base class must have a property</span>
+<span class="sd"> `supcon.util.Named.name`, that can be used as a key in a dictionary.</span>
+<span class="sd"> """</span>
+
+ <span class="nd">@property</span>
+ <span class="nd">@abc.abstractmethod</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The name of the instance. Is useable as a dictionary key.</span>
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/util.m.md#supcon.util.Named">Named</a></li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Instance variables</h3>
+ <div class="item">
+ <p id="supcon.util.Named.name" class="name">var <span class="ident">name</span></p>
+
+
+
+
+ <div class="desc"><p>The name of the instance. Is useable as a dictionary key.</p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="item">
+ <p id="supcon.util.NamedList" class="name">class <span class="ident">NamedList</span></p>
+
+
+ <div class="desc"><p>A <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> is an ordered, readonly dictionary of
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a> elements of value type
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a>.</p>
+<p>The class <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> itself can not be instantiated. It must be
+subclassed and the class property <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> set. The class
+property <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> denotes the type of the elements that
+the list can contain. The type <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> must be a
+subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and of <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a>. Elements in the
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> can be accessed by the values of their
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named.name"><code>name</code></a> property.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NamedList</span><span class="p">(</span><span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Mapping</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> A `supcon.util.NamedList` is an ordered, readonly dictionary of</span>
+<span class="sd"> `supcon.util.Named` and `supcon.util.Dumpable` elements of value type</span>
+<span class="sd"> `supcon.util.NamedList.vtype`.</span>
+
+<span class="sd"> The class `supcon.util.NamedList` itself can not be instantiated. It must be</span>
+<span class="sd"> subclassed and the class property `supcon.util.NamedList.vtype` set. The class</span>
+<span class="sd"> property `supcon.util.NamedList.vtype` denotes the type of the elements that</span>
+<span class="sd"> the list can contain. The type `supcon.util.NamedList.vtype` must be a</span>
+<span class="sd"> subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the</span>
+<span class="sd"> `supcon.util.NamedList.vtype` can be accessed by the values of their</span>
+<span class="sd"> `supcon.util.Named.name` property.</span>
+<span class="sd"> """</span>
+
+ <span class="n">vtype</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="sd">"""</span>
+<span class="sd"> Must be assigned in a subclass of `supcon.util.NamedList` to a subclass</span>
+<span class="sd"> of `supcon.util.Named` and `supcon.util.Dumpable`</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">"{}.{}({})"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
+ <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+
+ <div class="class">
+ <h3>Ancestors (in MRO)</h3>
+ <ul class="class_list">
+ <li><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList">NamedList</a></li>
+ <li>collections.abc.Mapping</li>
+ <li>collections.abc.Collection</li>
+ <li>collections.abc.Sized</li>
+ <li>collections.abc.Iterable</li>
+ <li>collections.abc.Container</li>
+ <li><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></li>
+ <li>abc.ABC</li>
+ <li>builtins.object</li>
+ </ul>
+ <h3>Class variables</h3>
+ <div class="item">
+ <p id="supcon.util.NamedList.vtype" class="name">var <span class="ident">vtype</span></p>
+
+
+
+
+ <div class="desc"><p>Must be assigned in a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> to a subclass
+of <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a></p></div>
+ <div class="source_cont">
+</div>
+
+ </div>
+ <h3>Class Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.load">
+ <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.load', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.load" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the given list of 'simple' datastructures **data** into an instance</span>
+<span class="sd"> of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.to">
+ <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.to', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.to" class="source">
+ <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd"> `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd"> of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd"> **cls**.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ <h3>Methods</h3>
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.__init__">
+ <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Initializes the <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> or a
+'simple' datastructure that can be converted to an instance of
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> by <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a>.load().</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.__init__', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.__init__" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd"> An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd"> 'simple' datastructure that can be converted to an instance of</span>
+<span class="sd"> `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Named'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'the value type must be a subclass of Dumpable'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'value.name must be unique in the given list of values'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.dump">
+ <p>def <span class="ident">dump</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>Converts the <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> into a list of 'simple' datastructures.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.dump', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.dump" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.get">
+ <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.get', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.get" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="s1">'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.items">
+ <p>def <span class="ident">items</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.items() -> a set-like object providing a view on D's items</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.items', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.items" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.items() -> a set-like object providing a view on D's items"</span>
+ <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.keys">
+ <p>def <span class="ident">keys</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.keys() -> a set-like object providing a view on D's keys</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.keys', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.keys" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.keys() -> a set-like object providing a view on D's keys"</span>
+ <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="item">
+ <div class="name def" id="supcon.util.NamedList.values">
+ <p>def <span class="ident">values</span>(</p><p>self)</p>
+ </div>
+
+
+
+
+ <div class="desc"><p>D.values() -> an object providing a view on D's values</p></div>
+ <div class="source_cont">
+ <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.values', this);">Show source ≡</a></p>
+ <div id="source-supcon.util.NamedList.values" class="source">
+ <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="s2">"D.values() -> an object providing a view on D's values"</span>
+ <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </div>
+</div>
+
+ </div>
+
+ </div>
+ </div>
+
+ </section>
+
+ </article>
+</div>
--- /dev/null
+#!/usr/bin/env python3
+
+import supcon.core
+
+from twisted.internet import reactor
+from twisted.internet.endpoints import TCP4ClientEndpoint
+
+local = 'listen'
+local = supcon.core.Node(local)
+
+printArgs = lambda *args: print(', '.join([ '{}'.format(i) for i in args ]))
+pluckArgs = lambda mapping, keys: (mapping[key] for key in keys)
+
+def onIntf(args, event):
+ (_Node, _Path, _Intf, eEvent) = event
+ (aNode, aPath, aInterface) = pluckArgs(args, ['node', 'path', 'intf'])
+ aInterface = supcon.intf.DInterface.load(aInterface)
+ for aEvent in aInterface.events:
+ reg = local.on if eEvent == 'intf' else local.off
+ reg(aNode, aPath, aInterface.name, aEvent, printArgs)
+
+local.on(local.name, '/', 'supcon.Local', 'intf', onIntf)
+local.on(local.name, '/', 'supcon.Local', 'intfLost', onIntf)
+
+local.on(local.name, '/', 'supcon.Local', 'intf', printArgs)
+local.on(local.name, '/', 'supcon.Local', 'intfLost', printArgs)
+
+local.connect(TCP4ClientEndpoint(reactor, 'localhost', 8123))
+
+reactor.run()
--- /dev/null
+# -*- coding: utf-8 -*-
+from setuptools import setup, find_packages
+
+#with open('README.rst') as f:
+# readme = f.read()
+
+#with open('LICENSE') as f:
+# license = f.read()
+
+install_requirements = [
+ 'msgpack-python',
+ 'twisted',
+ 'pigpio',
+ 'pyopenssl',
+ 'service-identity',
+]
+development_requirements = [
+ 'pdoc',
+ 'pylint',
+ 'pygments',
+]
+
+setup(
+ name='supcon',
+ version='0.0.1',
+ description='framework to access the supcon bus from python',
+# long_description=readme,
+ long_description='',
+ author='Sebastian Brix',
+ author_email='sebastian.brix@graph-it.com',
+ url='git://git.graph-it.com/screwerk/supcon',
+# license=license,
+ license='',
+ install_requires=install_requirements,
+ extras_require={
+ 'dev': development_requirements
+ },
+ packages=find_packages(exclude=('doc')),
+)
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+The `supcon` Framework provides inter-process communication (IPC) and remote
+procedure call (RPC) mechanisms, that allow communication between multiple
+computer programs running on different hosts in a TCP/IP network.
+
+Each participating program exposes one or more `supcon.intf.Node`s to the
+network. Each `supcon.intf.Node` has a name that must be unique among the
+nodes of the communicating programs.
+
+ #!python
+ import supcon.core
+
+ lServer = supcon.core.Node('my-unique-server')
+ lClient = supcon.core.Node('my-unique-client')
+
+You can give a `supcon.intf.Node` one or more endpoints on the network to either
+connect to or to listen for incomming connections.
+
+ #!python
+ from twisted.internet import reactor
+ from twisted.internet.endpoints import TCP4ClientEndpoint
+ from twisted.internet.endpoints import TCP4ServerEndpoint
+
+ lServer.listen(TCP4ServerEndpoint(reactor, 7000))
+ lClient.connect(TCP4ClientEndpoint(reactor, 'localhost', 7000))
+
+When a `supcon.intf.Node` is unable to create a connection to the given endpoint
+or an established connection terminates, the node tries to reestablish the
+connection.
+
+Programs can expose events and provide methods via the node. These events and
+methods are defined in `supcon.intf.Interface`s. Lets create one:
+
+ #!python
+ import supcon.intf
+
+ timerIntf = supcon.intf.Interface({
+ 'name': 'com.example.Timer',
+ 'events': [
+ {
+ 'name': 'timeout',
+ 'args': [
+ { 'name': 'timer', 'description': '(str) - The name of the timer' }
+ ]
+ 'description': 'Gets triggerd, whenever a timer times out.'
+ }
+ ],
+ 'methods': [
+ {
+ 'name': 'add',
+ 'inArgs': [
+ { 'name': 'timer', 'description': '(str) - A name for the timer' }
+ { 'name': 'seconds', 'description': '(float) - A duration' }
+ ],
+ 'description': 'Adds a new timer.'
+ }
+ ]
+ })
+
+Lets implement the interface and register the implementation at the local node:
+
+ #!python
+
+ timerImpl = supcon.intf.Implementation(timerIntf)
+
+ def fireTimeout(timer):
+ timerImpl.fire('timeout', { 'timer': timer })
+
+ def onAdd(timer, seconds):
+ reactor.callLater(seconds, lambda: fireTimeout(timer))
+
+ timerImpl.setCallCb('add', onAdd)
+
+ lServer.register('/myTimer', timerImpl)
+
+Now you can watch for timeout events and add a timer via the
+<code>lClient</code> reference:
+
+ #!python
+ lClient.on('my-unique-server', '/myTimer', 'com.example.Timer', 'timeout',
+ lambda *args: print(', '.join([ '{}'.format(i) for i in args ]))
+ )
+
+ lClient.call('my-unique-server', '/myTimer', 'com.example.Timer', 'add', {
+ 'timer': '5Seconds', 'seconds': 5
+ })
+
+And don't forget to start the reactor (aka event loop)
+
+ #!python
+ reactor.run()
+
+"""
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import supcon.intf
+
+class _Clone(supcon.intf.Implementation):
+
+ def __init__(self, local, rnode, rpath, interface):
+ super().__init__(interface)
+
+ self.__local = local
+ self.__rnode = rnode
+ self.__rpath = rpath
+
+ for event in self.interface.events:
+ self.__local.on(self.__rnode, self.__rpath, self.intf, event, self.__on)
+
+ def __del__(self):
+ for event in self.interface.events:
+ self.__local.off(self.__rnode, self.__rpath, self.intf, event, self.__on)
+
+ def __on(self, args: dict, event):
+ (_Node, _Path, _Intf, eEvent) = event
+ self.fire(eEvent, args)
+
+ def call(self, method, inArgs):
+ #print('_Clone.call', method, inArgs)
+ return self.__local.call(self.__rnode, self.__rpath, self.intf, method, inArgs)
+
+class Cloner(object):
+
+ def __init__(self, local: supcon.intf.Node, lPath: str, rNode: str, rPath: str, rIntf: str):
+ #print('Cloner.__init__')
+ self.__local = local
+ self.__lPath = lPath
+
+ self.__rNode = rNode
+ self.__rPath = rPath
+ self.__rIntf = rIntf
+
+ self.__impl = None
+
+ self.__local.on(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+ self.__local.on(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntf)
+
+ nodes = local.nodes()
+ if nodes.hasIntf(rNode, rPath, rIntf):
+ self.__setupImpl(nodes[rNode][rPath][rIntf])
+
+ @property
+ def local(self) -> supcon.intf.Node:
+ return self.__local
+
+ @property
+ def lPath(self) -> str:
+ return self.__lPath
+
+ @property
+ def rNode(self) -> str:
+ return self.__rNode
+
+ @property
+ def rPath(self) -> str:
+ return self.__rPath
+
+ @property
+ def rIntf(self) -> str:
+ return self.__rIntf
+
+ def __onIntf(self, args, event):
+ if args['node'] != self.__rNode or args['path'] != self.__rPath:
+ return
+ aInterface = supcon.intf.DInterface.load(args['intf'])
+ if aInterface.name != self.__rIntf:
+ return
+
+ if event[3] == 'intf':
+ self.__setupImpl(aInterface)
+ else:
+ self.__teardownImpl()
+
+ def __setupImpl(self, interface):
+ #print('Cloner.__setupImpl')
+ self.__impl = _Clone(self.__local, self.__rNode, self.__rPath, interface)
+ self.__local.register(self.__lPath, self.__impl)
+
+ def __teardownImpl(self):
+ self.__local.unregister(self.__lPath, self.__impl)
+ self.__impl = None
+
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+This module provides the implementation of abstract class `supcon.intf.Node`.
+"""
+
+import sys
+import traceback
+
+import uuid
+import struct
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.protocol
+import twisted.internet.endpoints
+
+import twisted.application.service
+import twisted.application.internet
+
+import supcon.intf
+
+_printArgs = lambda *args: print(', '.join(['{}'.format(i) for i in args]))
+
+LocalIntf = supcon.intf.DInterface.load({
+ 'name': 'supcon.Local',
+ 'events': [
+ {
+ 'name': 'node',
+ 'args': [
+ {'name': 'node', 'description': 'The node'},
+ ],
+ },
+ {
+ 'name': 'nodeLost',
+ 'args': [
+ {'name': 'node', 'description': 'The lost node'},
+ ],
+ },
+ {
+ 'name': 'path',
+ 'args': [
+ {'name': 'node', 'description': 'The node'},
+ {'name': 'path', 'description': 'The path'},
+ ],
+ },
+ {
+ 'name': 'pathLost',
+ 'args': [
+ {'name': 'node', 'description': 'The node'},
+ {'name': 'path', 'description': 'The path'},
+ ],
+ },
+ {
+ 'name': 'intf',
+ 'args': [
+ {'name': 'node', 'description': 'The node'},
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ ],
+ },
+ {
+ 'name': 'intfLost',
+ 'args': [
+ {'name': 'node', 'description': 'The node'},
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ ],
+ },
+ ],
+ 'methods': [
+ {
+ 'name': 'nodes',
+ 'outArgs': [
+ {'name': 'nodes', 'description': 'A datastructure about all known nodes, paths and interfaces'},
+ ],
+ },
+ ],
+ 'description': 'All methods and events are only locally available'
+})
+
+RemoteIntf = supcon.intf.DInterface.load({
+ 'name': 'supcon.Remote',
+ 'events': [
+ {
+ 'name': 'intf',
+ 'args': [
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ ],
+ },
+ {
+ 'name': 'intfLost',
+ 'args': [
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ ],
+ },
+ ],
+ 'methods': [
+ {
+ 'name': 'node',
+ 'outArgs': [
+ {'name': 'node', 'description': 'A datastructure about all paths and interfaces of the node'},
+ ],
+ },
+ {
+ 'name': 'on',
+ 'inArgs': [
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ {'name': 'event', 'description': 'The event'},
+ ],
+ },
+ {
+ 'name': 'off',
+ 'inArgs': [
+ {'name': 'path', 'description': 'The path'},
+ {'name': 'intf', 'description': 'The interface'},
+ {'name': 'event', 'description': 'The event'},
+ ],
+ },
+ ],
+ 'description': 'All methods and events are only used internally'
+})
+
+
+class _Protocol(twisted.internet.protocol.Protocol):
+ """This class handels handshake and message encoding between nodes on the bus.
+
+ This class is just an implementation detail of the class Node.
+ """
+ def __init__(self):
+ super().__init__()
+ self.factory = None
+
+ self.__data = bytearray()
+ self.__name = None
+
+ def connectionMade(self):
+ self.sendMesg({
+ 'type': 'handshake',
+ 'name': self.factory.name
+ })
+
+ def connectionLost(self, reason):
+ if not self.__name:
+ return
+ self.factory.delNode(self.__name)
+
+ def dataReceived(self, data):
+ self.__data.extend(data)
+
+ while len(self.__data) > 4:
+
+ size = struct.unpack_from('<L', self.__data)[0]
+ if len(self.__data) < size + 4:
+ break
+
+ mesg = self.__data[4:size + 4]
+ self.__data = self.__data[size + 4:]
+
+ try:
+ mesg = msgpack.unpackb(mesg, encoding='utf-8')
+ except BaseException as _:
+ self.transport.loseConnection()
+ else:
+ self.recvMesg(mesg)
+
+ def recvMesg(self, mesg):
+ if not self.__name:
+ if mesg['type'] != 'handshake':
+ self.transport.loseConnection()
+ return
+
+ self.__name = mesg['name']
+ self.factory.addNode(self.__name, self)
+ else:
+ self.factory.recvMesg(self.__name, mesg)
+
+ def sendMesg(self, mesg):
+ data = msgpack.packb(mesg, use_bin_type=True)
+ size = struct.pack('<L', len(data))
+
+ self.transport.write(size)
+ self.transport.write(data)
+
+
+class _Factory(twisted.internet.protocol.Factory):
+ """This class creates _Protocol instances for connections to remote nodes.
+
+ This class is just an implementation detail of the class Node and encapulates
+ methods to create the _Protocol instances resulting from calls to
+ Node.connect() and Node.listen().
+ """
+ protocol = _Protocol
+
+ def __init__(self, name, addNode, delNode, recvMesg):
+ self.name = name
+ self.addNode = addNode
+ self.delNode = delNode
+ self.recvMesg = recvMesg
+
+
+class _KnownMgr(object):
+
+ def __init__(self, fire):
+ self.__fire = fire
+
+ self.__nodes = supcon.intf.DNodes()
+
+ def addNode(self, node: str) -> bool:
+ if node in self.__nodes:
+ return True
+
+ self.__nodes = self.__nodes.addNode(node)
+
+ self.__fire('node', {'node': node})
+ return True
+
+ def delNode(self, node: str) -> bool:
+ if node not in self.__nodes:
+ return True
+
+ for path in self.__nodes[node]:
+ for intf in self.__nodes[node][path]:
+ self.delIntf(node, path, self.__nodes[node][path][intf])
+
+ self.__nodes = self.__nodes.delNode(node)
+ self.__fire('nodeLost', {'node': node})
+ return True
+
+ def addIntf(self, node: str, path: str, interface: supcon.intf.DInterface) -> bool:
+ #_printArgs('_KnownMgr.addIntf', node, path, interface)
+ if node not in self.__nodes:
+ return False
+
+ if path not in self.__nodes[node]:
+ self.__nodes = self.__nodes.addPath(node, path)
+ self.__fire('path', {'node': node, 'path': path})
+
+ if interface.name in self.__nodes[node][path]:
+ return True
+
+ self.__nodes = self.__nodes.addInterface(node, path, interface)
+ self.__fire('intf', {'node': node, 'path': path, 'intf': interface.dump()})
+ return True
+
+ def delIntf(self, node: str, path: str, interface: supcon.intf.DInterface) -> bool:
+ #_printArgs('_KnownMgr.delIntf', node, path, interface)
+ if not self.__nodes.hasIntf(node, path, interface.name):
+ return True
+
+ self.__nodes = self.__nodes.delInterface(node, path, interface)
+ self.__fire('intfLost', {'node': node, 'path': path, 'intf': interface.dump()})
+
+ if not self.__nodes[node][path]:
+ self.__nodes = self.__nodes.delPath(node, path)
+ self.__fire('pathLost', {'node': node, 'path': path})
+
+ return True
+
+ def getNode(self, node: str) -> supcon.intf.DNode:
+ if node in self.__nodes:
+ return self.__nodes[node]
+ return None
+
+ def setNode(self, newNode: supcon.intf.DNode):
+ #_printArgs('_KnownMgr.setNode', newNode.dump())
+ oldNode = self.getNode(newNode.name)
+
+ for oldPath in oldNode.values():
+ for oldIntf in oldPath.values():
+ if not newNode.hasIntf(oldPath.name, oldIntf.name):
+ self.delIntf(oldNode.name, oldPath.name, oldIntf)
+
+ for newPath in newNode.values():
+ for newIntf in newPath.values():
+ if not oldNode.hasIntf(newPath.name, newIntf.name):
+ self.addIntf(newNode.name, newPath.name, newIntf)
+
+ def getNodes(self) -> supcon.intf.DNodes:
+ return self.__nodes
+
+
+class _InformMgr(object):
+
+ def __init__(self):
+
+ self.__keys = {}
+ self.__nodes = {}
+
+ def on(self, path, intf, event, node):
+ key = (path, intf, event)
+
+ if key not in self.__nodes:
+ self.__nodes[key] = {}
+ self.__nodes[key][node] = True
+
+ if node not in self.__keys:
+ self.__keys[node] = {}
+ self.__keys[node][key] = True
+
+ def off(self, path, intf, event, node):
+ key = (path, intf, event)
+ if key not in self.__nodes or node not in self.__nodes[key]:
+ return
+
+ del self.__nodes[key][node]
+ if not self.__nodes[key]:
+ del self.__nodes[key]
+
+ del self.__keys[node][key]
+ if not self.__keys[node]:
+ del self.__keys[node]
+
+ def nodes(self, path, intf, event):
+ key = (path, intf, event)
+ if key not in self.__nodes:
+ return []
+ return self.__nodes[key].keys()
+
+ def delNode(self, node):
+ if node not in self.__keys:
+ return
+ for key in self.__keys[node]:
+ del self.__nodes[key][node]
+ if not self.__nodes[key]:
+ del self.__nodes[key]
+ del self.__keys[node]
+
+
+class _DeferredMgr(object):
+ """ This class manages Deferred """
+
+ def __init__(self):
+ self.__infos = {}
+
+ def create(self, data=None) -> (str, defer.Deferred):
+ """Creates a Deferred with an info.
+
+ Args:
+ data: Some additional data
+
+ Returns:
+ (str, defer.Deferred): A Tuple of an unique id and a Deferred
+ """
+ pid = str(uuid.uuid4())
+
+ def canceller(_d):
+ del self.__infos[pid]
+
+ d = defer.Deferred(canceller)
+ self.__infos[pid] = (d, data)
+
+ return (pid, d)
+
+ def succeed(self, value, pid):
+ """Succeeds the Deferred identified by the given unique id with the given
+ response.
+
+ Args:
+ pid (str): A unique id of a Deferred created with _DeferredMgr.create()
+ value (mixed): The value to succeed the Deferred with
+ """
+ if pid not in self.__infos:
+ return
+
+ d = self.__infos[pid][0]
+ del self.__infos[pid]
+ d.callback(value)
+
+ def fail(self, reason, pid):
+ """Fail the Deferred identified by the given unique id with the given
+ reason.
+
+ Args:
+ reason (Exception): The reason to fail the Deferred with
+ pid (str): A unique id of a Deferred created with _DeferredMgr.create()
+ """
+ if pid not in self.__infos:
+ return
+
+ d = self.__infos[pid][0]
+ del self.__infos[pid]
+ d.errback(reason)
+
+ def failAll(self, reason, predicate):
+ """Fail all Deferred for which predicate(data) returns true.
+
+ Args:
+ reason (Exception): The reason to fail the Deferred with
+ predicate (function): A predicate
+ """
+ for pid, info in self.__infos.copy().items():
+ if predicate(pid, info[1]):
+ del self.__infos[pid]
+ info[0].errback(reason)
+
+
+class _CallbackMgr(object):
+
+ def __init__(self):
+ self.__cbs = {}
+
+ def on(self, key, cb):
+ first = False
+ if key not in self.__cbs:
+ self.__cbs[key] = {}
+ first = True
+ self.__cbs[key][id(cb)] = cb
+ return first
+
+ def off(self, key, cb):
+ if key not in self.__cbs or id(cb) not in self.__cbs[key]:
+ return False
+ del self.__cbs[key][id(cb)]
+ if not self.__cbs[key]:
+ del self.__cbs[key]
+ return True
+ return False
+
+ def fire(self, key, args):
+ #_printArgs('_CallbackMgr.fire', key, args)
+ if key not in self.__cbs:
+ return
+ for cb in self.__cbs[key].values():
+ try:
+ cb(args, key)
+ except BaseException as _:
+ traceback.print_exc()
+
+ def keys(self, predicate):
+ return [key for key in self.__cbs if predicate(key)]
+
+
+class Node(supcon.intf.Node):
+
+ def __init__(self, name):
+ super().__init__(name)
+
+ self.__impls = {}
+ self.__protocols = {}
+
+ self.__factory = _Factory(self.name, self.__addNode, self.__delNode, self.__recvMesg)
+
+ self.__service = twisted.application.service.MultiService()
+ self.__service.startService()
+
+ fire = lambda event, args: \
+ self.__fireEventLocal(self.name, '/', LocalIntf.name, event, args)
+
+ self.__knownMgr = _KnownMgr(fire)
+ self.__informMgr = _InformMgr()
+ self.__callbackMgr = _CallbackMgr()
+ self.__deferredMgr = _DeferredMgr()
+
+ self.__knownMgr.addNode(self.name)
+
+ def connect(self, endpoint):
+ service = twisted.application.internet.ClientService(endpoint, self.__factory)
+ self.__service.addService(service)
+
+ def listen(self, endpoint):
+ endpoint.listen(self.__factory)
+
+ def __addNode(self, node: str, protocol: _Protocol):
+ if node in self.__protocols:
+ return False
+ self.__protocols[node] = protocol
+
+ self.__knownMgr.addNode(node)
+
+ # reestablish existing callbacks by calls to supcon.Remote.on
+ for key in self.__callbackMgr.keys(lambda key: key[0] == node):
+ self.__callRemote(node, '/', RemoteIntf.name, 'on', {
+ 'path': key[1],
+ 'intf': key[2],
+ 'event': key[3]
+ })
+
+ self.__callRemote(node, '/', RemoteIntf.name, 'node', {}).addCallback(
+ lambda args: self.__knownMgr.setNode(supcon.intf.DNode.load(args['node']))
+ ).addErrback(_printArgs)
+
+ return True
+
+ def __delNode(self, node):
+ if node not in self.__protocols:
+ return False
+ del self.__protocols[node]
+
+ self.__knownMgr.delNode(node)
+ self.__informMgr.delNode(node)
+
+ reason = RuntimeError('node {} lost'.format(node))
+ predicate = lambda pid, data: data[0] == node
+ self.__deferredMgr.failAll(reason, predicate)
+
+ return True
+
+ def nodes(self):
+ return self.__knownMgr.getNodes()
+
+ def register(self, path: str, impl: supcon.intf.Implementation):
+ path = supcon.intf.DPath.toName(path)
+
+ if path not in self.__impls:
+ self.__impls[path] = {}
+
+ if impl.intf in self.__impls[path]:
+ raise ValueError('interface {} already registered at path {}'.format(impl.intf, path))
+
+ self.__impls[path][impl.intf] = {
+ 'impl': impl,
+ 'fire': lambda event, args: self.__fireImplEvent(path, impl.intf, event, args)
+ }
+ impl.addFireCb(self.__impls[path][impl.intf]['fire'])
+
+ self.__knownMgr.addIntf(self.name, path, impl.interface)
+ self.__broadcastEvent('intf', {'path': path, 'intf': impl.interface.dump()})
+
+ def unregister(self, path: str, impl: supcon.intf.Implementation):
+ path = supcon.intf.DPath.toName(path)
+
+ if path not in self.__impls:
+ raise ValueError('unknown path {}'.format(path))
+
+ if impl.intf not in self.__impls[path]:
+ raise ValueError('unknown interface {} at path {}'.format(impl.intf, path))
+
+ if impl != self.__impls[path][impl.intf]['impl']:
+ raise ValueError('unknown implementation for interface {} at path {}'.format(impl.intf, path))
+
+ impl.delFireCb(self.__impls[path][impl.intf]['fire'])
+ del self.__impls[path][impl.intf]
+
+ self.__knownMgr.delIntf(self.name, path, impl.interface)
+ self.__broadcastEvent('intfLost', {'path': path, 'intf': impl.interface.dump()})
+
+ def on(self, node, path, intf, event, cb):
+ if self.__callbackMgr.on((node, path, intf, event), cb):
+ if node != self.name and node in self.__protocols:
+ self.__callRemote(node, '/', RemoteIntf.name, 'on', {
+ 'path': path, 'intf': intf, 'event': event
+ })
+
+ def off(self, node, path, intf, event, cb):
+ if self.__callbackMgr.off((node, path, intf, event), cb):
+ if node != self.name and node in self.__protocols:
+ self.__callRemote(node, '/', RemoteIntf.name, 'off', {
+ 'path': path, 'intf': intf, 'event': event
+ })
+
+ def call(self, node, path, intf, method, args) -> defer.Deferred:
+ # TODO: don't raise Exceptions
+ assert path != '/' or intf != RemoteIntf.name, \
+ 'unable to call: method {} of interface {} at path /'.format(method, RemoteIntf.name)
+
+ if node == self.name:
+ if path == '/' and intf == LocalIntf.name:
+ return self.__callLocal(method, args)
+ return self.__callImpl(path, intf, method, args)
+ return self.__callRemote(node, path, intf, method, args)
+
+ def __callImpl(self, path, intf, method, args) -> defer.Deferred:
+ # TODO: don't raise Exception
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to call impl: method {} of interface {} at path /'.format(method, LocalIntf.name)
+ assert path != '/' or intf != RemoteIntf.name, \
+ 'unable to call impl: method {} of interface {} at path /'.format(method, RemoteIntf.name)
+
+ try:
+ if path not in self.__impls:
+ raise ValueError('unknown path') # TODO: nicer error message
+ if intf not in self.__impls[path]:
+ raise ValueError('unknown intf') # TODO: nicer error message
+ if method not in self.__impls[path][intf]['impl'].interface.methods:
+ raise ValueError('unknown method') # TODO: nicer error message
+
+ d = self.__impls[path][intf]['impl'].call(method, args)
+ if not isinstance(d, defer.Deferred):
+ d = defer.succeed(d)
+ except BaseException as e:
+ d = defer.fail(e)
+
+ return d
+
+ def __callLocal(self, method, args) -> defer.Deferred:
+ # TODO: don't raise Exception
+ assert method in LocalIntf.methods, \
+ '{} is not an method of interface {} at path /'.format(method, RemoteIntf.name)
+ LocalIntf.methods[method].validateInArgs(args)
+
+ if method == 'nodes':
+ return defer.succeed({'nodes': self.__knownMgr.getNodes().dump()})
+
+ return defer.fail(RuntimeError('method {} not yet implemented'.format(method)))
+
+ def __callRemote(self, node, path, intf, method, args) -> defer.Deferred:
+ # TODO: don't raise Exception
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to call remote: method {} of interface {} at path /'.format(method, LocalIntf.name)
+
+ # TODO: validate args
+
+ (cid, p) = self.__deferredMgr.create((node, path, intf, method))
+ self.__sendCall(node, path, intf, method, args, cid)
+ return p
+
+ def __fireImplEvent(self, path, intf, event, args):
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to fire impl: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+ assert path != '/' or intf != RemoteIntf.name, \
+ 'unable to fire impl: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+
+ self.__fireEventLocal(self.name, path, intf, event, args)
+ self.__fireEventRemote(path, intf, event, args)
+
+ def __fireEventLocal(self, node: str, path: str, intf: str, event: str, args: dict):
+ assert path != '/' or intf != RemoteIntf.name, \
+ 'unable to fire local: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+ #_printArgs('Node.__fireEventLocal', node, path, intf, event, args)
+
+ # TODO: validate args
+
+ self.__callbackMgr.fire((node, path, intf, event), args)
+
+ def __fireEventRemote(self, path: str, intf: str, event: str, args: dict):
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to fire remote: event {} of interface {} at path /'.format(event, LocalIntf.name)
+
+ for node in self.__informMgr.nodes(path, intf, event):
+ self.__sendEvent(node, path, intf, event, args)
+
+ def __broadcastEvent(self, event: str, args: dict):
+ try:
+ assert event in RemoteIntf.events, \
+ '{} is not an event of interface {} at path /'.format(event, RemoteIntf.name)
+ RemoteIntf.events[event].validateArgs(args)
+ except BaseException as _:
+ traceback.print_exc()
+ return
+
+ for node in self.__protocols:
+ self.__sendEvent(node, '/', RemoteIntf.name, event, args)
+
+ def __recvMesg(self, node: str, mesg: dict):
+ """Gets called by _Protocol on new Message"""
+ if node not in self.__protocols:
+ return False
+
+ if mesg['type'] == 'call':
+ self.__recvCall(node, mesg['path'], mesg['intf'], mesg['name'], mesg['args'], mesg['id'])
+ elif mesg['type'] == 'error':
+ self.__recvError(node, mesg['args'], mesg['id'])
+ elif mesg['type'] == 'response':
+ self.__recvResult(node, mesg['args'], mesg['id'])
+ elif mesg['type'] == 'event':
+ self.__recvEvent(node, mesg['path'], mesg['intf'], mesg['name'], mesg['args'])
+ else:
+ return False
+
+ return True
+
+ def __recvCall(self, node: str, path: str, intf: str, method: str, args: dict, cid: str):
+ try:
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to recv call: method {} of interface {} at path / from node {}'.format(method, intf, node)
+
+ if path == '/' and intf == RemoteIntf.name:
+ assert method in RemoteIntf.methods, \
+ '{} is not an method of interface {} at path /'.format(method, RemoteIntf.name)
+ RemoteIntf.methods[method].validateInArgs(args)
+
+ if method == 'node':
+ d = defer.succeed({'node': self.__knownMgr.getNode(self.name).dump()})
+ elif method == 'on':
+ self.__informMgr.on(args['path'], args['intf'], args['event'], node)
+ d = defer.succeed({})
+ elif method == 'off':
+ self.__informMgr.on(args['path'], args['intf'], args['event'], node)
+ d = defer.succeed({})
+ else:
+ raise ValueError('method {} is not yet implemented'.format(method))
+ else:
+ d = self.__callImpl(path, intf, method, args)
+ except BaseException as e:
+ traceback.print_exc()
+ d = defer.fail(e)
+
+ d.addCallbacks(
+ lambda result: self.__sendResult(node, result, cid),
+ lambda reason: self.__sendError(node, repr(reason), cid)
+ ).addErrback(_printArgs)
+
+ def __recvError(self, _node: str, reason: str, cid: str):
+ try:
+ self.__deferredMgr.fail(RuntimeError(reason), cid)
+ except BaseException as _:
+ traceback.print_exc()
+
+ def __recvResult(self, _node: str, result: dict, cid: str):
+ try:
+ self.__deferredMgr.succeed(result, cid)
+ except BaseException as _:
+ traceback.print_exc()
+
+ def __recvEvent(self, node: str, path: str, intf: str, event: str, args: dict):
+ try:
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to recv event: event {} of interface {} at path /'.format(event, LocalIntf.name)
+
+ if path == '/' and intf == RemoteIntf.name:
+ assert event in RemoteIntf.events, \
+ '{} is not an event of interface {} at path /'.format(event, RemoteIntf.name)
+ RemoteIntf.events[event].validateArgs(args)
+
+ self.__recvEventRemote(node, event, args)
+ else:
+ self.__fireEventLocal(node, path, intf, event, args)
+ except BaseException as _:
+ traceback.print_exc()
+
+ def __recvEventRemote(self, node, event, args):
+ if event == 'intf':
+ path = args['path']
+ interface = supcon.intf.DInterface.load(args['intf'])
+
+ self.__knownMgr.addIntf(node, path, interface)
+
+ elif event == 'intfLost':
+ path = args['path']
+ interface = supcon.intf.DInterface.load(args['intf'])
+
+ self.__knownMgr.delIntf(node, path, interface)
+
+ reason = RuntimeError('interface {} at path {} on node {} lost'.format(node, path, interface.name))
+ predicate = lambda pid, data: data[0] == node and data[1] == path and data[2] == interface.name
+ self.__deferredMgr.failAll(reason, predicate)
+
+ else:
+ raise ValueError('event {} not yet implemented'.format(event))
+
+ def __sendCall(self, node: str, path: str, intf: str, method: str, args: dict, cid: str) -> bool:
+ try:
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to send call: method {} of interface {} at path /'.format(method, LocalIntf.name)
+ if node not in self.__protocols:
+ raise RuntimeError('unknown node {}'.format(node))
+
+ self.__protocols[node].sendMesg({
+ 'type': 'call',
+ 'path': path,
+ 'intf': intf,
+ 'name': method,
+ 'args': args,
+ 'id': cid
+ })
+ return True
+ except BaseException as _:
+ traceback.print_exc()
+ return False
+
+ def __sendError(self, node: str, reason: str, cid: str) -> bool:
+ try:
+ if node not in self.__protocols:
+ raise RuntimeError('unknown node {}'.format(node))
+
+ self.__protocols[node].sendMesg({
+ 'type': 'error',
+ 'args': reason,
+ 'id': cid
+ })
+ return True
+ except BaseException as _:
+ traceback.print_exc()
+ return False
+
+ def __sendResult(self, node: str, result: dict, cid: str) -> bool:
+ try:
+ if node not in self.__protocols:
+ raise RuntimeError('unknown node {}'.format(node))
+
+ self.__protocols[node].sendMesg({
+ 'type': 'response',
+ 'args': result,
+ 'id': cid
+ })
+ return True
+ except BaseException as _:
+ traceback.print_exc()
+ return False
+
+ def __sendEvent(self, node: str, path: str, intf: str, event: str, args: dict) -> bool:
+ try:
+ assert path != '/' or intf != LocalIntf.name, \
+ 'unable to send event: event {} of interface {} at path /'.format(event, LocalIntf.name)
+ if node not in self.__protocols:
+ traceback.print_stack()
+ raise RuntimeError('unknown node {}'.format(node))
+
+ self.__protocols[node].sendMesg({
+ 'type': 'event',
+ 'path': path,
+ 'intf': intf,
+ 'name': event,
+ 'args': args
+ })
+ return True
+ except BaseException as _:
+ exc_info = sys.exc_info()
+ traceback.print_exception(*exc_info)
+ return False
--- /dev/null
+
+
+import struct
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.interfaces
+import twisted.internet.protocol
+
+class _Protocol(twisted.internet.protocol.Protocol):
+
+ def __init__(self):
+ super().__init__()
+ self.factory = None
+
+ self.__data = bytearray()
+ self.__name = None
+
+ def dataReceived(self, data):
+ self.__data.extend(data)
+
+ while len(self.__data) > 4:
+
+ size = struct.unpack_from('<L', self.__data)[0]
+ if len(self.__data) < size + 4:
+ break
+
+ mesg = self.__data[4:size + 4]
+ self.__data = self.__data[size + 4:]
+
+ try:
+ mesg = msgpack.unpackb(mesg)
+ except BaseException as e:
+ self.factory.close(e)
+ else:
+ self.factory.recv(mesg)
+
+ def send(self, mesg):
+ data = msgpack.packb(mesg)
+ size = struct.pack('<L', len(data))
+
+ self.transport.write(size)
+ self.transport.write(data)
+
+ def close(self):
+ self.transport.loseConnection()
+
+class _Factory(twisted.internet.protocol.Factory):
+ protocol = _Protocol
+
+ def __init__(self, recv, close):
+ self.__recv = recv
+ self.__close = close
+
+ @property
+ def recv(self):
+ return self.__recv
+
+ @property
+ def close(self):
+ return self.__close
+
+
+class Connection(object):
+
+ def __init__(self, point: twisted.internet.interfaces.IStreamClientEndpoint):
+ self.__point = point
+
+ self.__lock = defer.DeferredLock()
+ self.__factory = _Factory(self.__recv, self.__close)
+
+ self.__proto = None
+ self.__callid = 0
+
+ self.__deferred = None
+
+ def __del__(self):
+ self.__close()
+
+ @defer.inlineCallbacks
+ def __open(self):
+ self.__proto = yield self.__point.connect(self.__factory)
+ yield self.__read()
+
+ def __close(self, reason=None):
+ if self.__proto:
+ self.__proto.close()
+ self.__proto = None
+
+ self.__callid = 0
+
+ if self.__deferred:
+ d = self.__deferred
+ self.__deferred = None
+ d.errback(reason)
+
+ def __read(self):
+ if self.__deferred:
+ raise RuntimeError('Already reading???')
+ self.__deferred = defer.Deferred()
+ return self.__deferred
+
+ def __recv(self, mesg):
+ if not self.__deferred:
+ raise RuntimeError('Not reading???')
+ d = self.__deferred
+ self.__deferred = None
+ d.callback(mesg)
+
+ def __write(self, mesg):
+ self.__proto.send(mesg)
+
+ @defer.inlineCallbacks
+ def __call(self, method, params):
+ yield self.__lock.acquire()
+
+ try:
+ if self.__callid == 0:
+ yield self.__open()
+ self.__callid += 1
+
+ req = {
+ b'jsonrpc': b'2.0',
+ b'method': method,
+ b'params': params,
+ b'id': self.__callid,
+ }
+ self.__write(req)
+
+ res = yield self.__read()
+ finally:
+ self.__lock.release()
+
+ if b'jsonrpc' not in res or res[b'jsonrpc'] != req[b'jsonrpc']:
+ raise Exception('Not a JSON-RPC 2.0 response!')
+ if b'error' in res:
+ raise Exception('JSON-RPC: Remote error: {0}'.format(res[b'error']))
+ if b'id' not in res or res[b'id'] != req[b'id']:
+ raise Exception('JSON-RPC id missing or invalid')
+
+ return res[b'result']
+
+ def __getattr__(self, attr):
+ return lambda *args: self.__call(attr, args)
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+This module contains the classes to describe interfaces on the supcon bus,
+a base class `supcon.intf.Implementation` to implemet those interfaces and the
+abstract class `supcon.intf.Node` which contains methods to interact with the
+supcon bus.
+"""
+
+import re
+import abc
+import itertools
+import traceback
+
+import twisted.internet.defer as defer
+
+import supcon.util
+
+class Named(supcon.util.Named):
+ """A base class for objects with a name.
+ """
+
+ regex = None
+ """re.RegexObject: a regular expression, the name must conform to"""
+
+ def __init__(self, name):
+ """Initializes the NamedAndDescribed instance
+
+ Args:
+ name (str): the name of the argument
+ """
+ self.__name = self.toName(name)
+
+ @property
+ def name(self) -> str:
+ """str: the name"""
+ return self.__name
+
+ @classmethod
+ def toName(cls, value) -> str:
+ """Converts the value into a name. If this is impossible a ValueError is
+ raised.
+
+ Args:
+ value (any): the value
+ Raises:
+ ValueError
+ """
+ value = str(value)
+ if not cls.regex.fullmatch(value):
+ raise ValueError("value {} must match {} fully".format(value, cls.regex.pattern))
+ return value
+
+
+class NamedAndDescribed(Named):
+ """A base class for the interface describing classes `supcon.intf.Argument`,
+ `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that
+ all have the properties name and description."""
+
+ def __init__(self, name, description=''):
+ """Initializes the NamedAndDescribed instance
+
+ Args:
+ name (str): the name of the argument
+ description (str): a description of the argument
+ """
+ Named.__init__(self, name)
+ self.__description = self.toDescription(description)
+
+ @property
+ def description(self) -> str:
+ """str: a description"""
+ return self.__description
+
+ @classmethod
+ def toDescription(cls, value) -> str:
+ """Converts the value into a description. If this is impossible a ValueError
+ is raised.
+
+ Args:
+ value (any): the value
+ Raises:
+ ValueError
+ """
+ return str(value)
+
+
+class DArgument(supcon.util.Dumpable, NamedAndDescribed):
+ """Describes an input or output argument of a `supcon.intf.DMethod` or an
+ argument of a `supcon.intf.DEvent`"""
+
+ regex = re.compile('[a-zA-Z0-9]+')
+
+ def validate(self, argument):
+ """Validates the given argument value. Raises an ValueError if validation
+ fails.
+ """
+ pass
+
+ def dump(self):
+ data = {'name': self.name}
+ if self.description != '':
+ data['description'] = self.description
+ return data
+
+ @classmethod
+ def load(cls, data):
+ return cls(**data)
+
+
+class DArguments(supcon.util.NamedList):
+ """A readonly map of `supcon.intf.DArgument` instances"""
+ vtype = DArgument
+
+
+class DEvent(supcon.util.Dumpable, NamedAndDescribed):
+ """Describes an event that can be emitted by an implementation on the bus"""
+
+ regex = re.compile('[a-zA-Z0-9]+')
+
+ def __init__(self, name, args=DArguments(), description=''):
+ """Initializes the Event
+
+ Args:
+ name (str): the name of the event
+ args (DArguments): the list of arguments of the event
+ description (str): a description of the event
+ """
+ NamedAndDescribed.__init__(self, name, description)
+ self.__args = DArguments.to(args)
+
+ @property
+ def args(self) -> DArguments:
+ """DArguments: the list of arguments of the event"""
+ return self.__args
+
+ def validateArgs(self, args):
+ """Validates the given argument map. Raises an ValueError if validation
+ fails.
+ """
+ for arg in args:
+ if arg not in self.__args:
+ raise ValueError('event {} has no argument {}'.format(self.name, arg))
+ self.__args[arg].validate(args[arg])
+ for arg in self.__args:
+ if arg not in args:
+ raise ValueError('event {} needs argument {}'.format(self.name, arg))
+
+ def dump(self):
+ data = {'name': self.name}
+ if self.args:
+ data['args'] = self.args.dump()
+ if self.description != '':
+ data['description'] = self.description
+ return data
+
+ @classmethod
+ def load(cls, data):
+ return cls(**data)
+
+
+class DEvents(supcon.util.NamedList):
+ """A readonly map of `supcon.intf.DEvent` instances"""
+ vtype = DEvent
+
+
+class DMethod(supcon.util.Dumpable, NamedAndDescribed):
+ """A DMethod that can be called on an Object on the Bus"""
+
+ regex = re.compile('[a-zA-Z0-9]+')
+
+ def __init__(self, name, inArgs=DArguments(), outArgs=DArguments(), description=''):
+ """Initializes the Event
+
+ Args:
+ name (str): the name of the method
+ inArgs (DArguments): the list of input arguments of the method
+ outArgs (DArguments): the list of output arguments of the method
+ description (str): a description of the method
+ """
+ NamedAndDescribed.__init__(self, name, description)
+ self.__inArgs = DArguments.to(inArgs)#
+ self.__outArgs = DArguments.to(outArgs)
+
+ @property
+ def inArgs(self) -> DArguments:
+ """DArguments: The input arguments of the method"""
+ return self.__inArgs
+
+ @property
+ def outArgs(self) -> DArguments:
+ """DArguments: The output arguments of the method"""
+ return self.__outArgs
+
+ def validateInArgs(self, inArgs):
+ """Validates the given argument Mapping. Raises an ValueError if validation fails
+ """
+ for arg in inArgs:
+ if arg not in self.__inArgs:
+ raise ValueError('method {} has no input argument {}'.format(self.name, arg))
+ self.__inArgs[arg].validate(inArgs[arg])
+ for arg in self.__inArgs:
+ if arg not in inArgs:
+ raise ValueError('method {} needs input argument {}'.format(self.name, arg))
+
+ def validateOutArgs(self, outArgs):
+ """Validates the given argument Mapping. Raises an ValueError if validation fails
+ """
+ for arg in outArgs:
+ if arg not in self.__outArgs:
+ raise ValueError('method {} has no output argument {}'.format(self.name, arg))
+ self.__outArgs[arg].validate(outArgs[arg])
+ for arg in self.__outArgs:
+ if arg not in outArgs:
+ raise ValueError('method {} needs output argument {}'.format(self.name, arg))
+
+ def dump(self):
+ data = {'name': self.name}
+ if self.inArgs:
+ data['inArgs'] = self.inArgs.dump()
+ if self.outArgs:
+ data['outArgs'] = self.outArgs.dump()
+ if self.description != '':
+ data['description'] = self.description
+ return data
+
+ @classmethod
+ def load(cls, data):
+ return cls(**data)
+
+
+class DMethods(supcon.util.NamedList):
+ """A readonly map of `supcon.intf.DMethod` instances"""
+ vtype = DMethod
+
+
+class DInterface(supcon.util.Dumpable, NamedAndDescribed):
+ """An Interface that is implemented by an Object on the Bus"""
+
+ regex = re.compile('([a-zA-Z0-9_]+\\.)*[a-zA-Z0-9_]+')
+
+ def __init__(self, name, events=DEvents(), methods=DMethods(), description=''):
+ """Initializes the Event
+
+ Args:
+ name (str): the name of the interface
+ events (DEvents): the list of events of the interface
+ methods (DMethods): the list of methods of the interface
+ description (str): a description of the interface
+ """
+ NamedAndDescribed.__init__(self, name, description)
+ self.__events = DEvents.to(events)
+ self.__methods = DMethods.to(methods)
+
+ @property
+ def events(self) -> DEvents:
+ """DEvent: the list of events this interface can emit"""
+ return self.__events
+
+ @property
+ def methods(self) -> DMethods:
+ """DMethods: the list of methods this interface provides"""
+ return self.__methods
+
+ def validateEvent(self, event, args):
+ """Validates that the given event is an event of this interface and that
+ the given arguments are arguments of the event
+
+ Args:
+ event (str): the event
+ args (dict): the arguments
+ Raises:
+ ValueError
+ """
+ event = str(event)
+ if event not in self.__events:
+ raise ValueError('event {} is unknown'.format(event))
+ self.__events[event].validateArgs(args)
+
+ def validateCall(self, method, inArgs):
+ """Asserts that the given method is a method of this interface and that
+ the given arguments are input arguments of the method
+
+ Args:
+ event (str): the event
+ inArgs (dict): the input arguments
+ Raises:
+ AssertationError
+ """
+ method = str(method)
+ if method not in self.__methods:
+ raise ValueError('method {} is unknown'.format(method))
+ self.__methods[method].validateInArgs(inArgs)
+
+ def validateReturn(self, method, outArgs):
+ """Asserts that the given method is a method of this interface and that
+ the given arguments are output arguments of the method
+
+ Args:
+ event (str): the event
+ outArgs (dict): the output arguments
+ Raises:
+ AssertationError
+ """
+ method = str(method)
+ if method not in self.__methods:
+ raise ValueError('method {} is unknown'.format(method))
+ self.__methods[method].validateOutArgs(outArgs)
+
+ def dump(self):
+ data = {'name': self.name}
+ if self.events:
+ data['events'] = self.events.dump()
+ if self.methods:
+ data['methods'] = self.methods.dump()
+ if self.description != '':
+ data['description'] = self.description
+ return data
+
+ @classmethod
+ def load(cls, data):
+ return cls(**data)
+
+
+class DInterfaces(supcon.util.NamedList):
+ """A readonly map of `supcon.intf.DInterface` instances"""
+ vtype = DInterface
+
+
+class DPath(Named, supcon.util.NamedList):
+ """A named readonly map of `supcon.intf.DInterface` instances"""
+
+ vtype = DInterface
+ regex = re.compile('/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?')
+
+ def __init__(self, name, interfaces=None):
+ """Initializes the Path instance
+
+ Args:
+ name (str): the name of the argument
+ interfaces (): ...
+ """
+ if interfaces is None:
+ interfaces = []
+ Named.__init__(self, name)
+ supcon.util.NamedList.__init__(self, interfaces)
+
+ def dump(self):
+ return {
+ 'name': self.name,
+ 'interfaces': [value.dump() for value in self.values()]
+ }
+
+ @classmethod
+ def load(cls, data) -> 'DPath':
+ return cls(**data)
+
+ def addInterface(self, interface: DInterface) -> 'DPath':
+ if interface.name in self:
+ raise ValueError('interface {} at path {} already exists'.format(interface.name, self.name))
+ interfaces = itertools.chain(self.values(), [interface])
+ return DPath(self.name, interfaces)
+
+ def delInterface(self, interface: DInterface) -> 'DPath':
+ if interface.name not in self:
+ raise ValueError('interface {} at path {} does not exist'.format(interface.name, self.name))
+ interfaces = (v for v in self.values() if v.name != interface.name)
+ return DPath(self.name, interfaces)
+
+
+class DNode(Named, supcon.util.NamedList):
+ """A named readonly map of `supcon.intf.DPath` instances"""
+
+ vtype = DPath
+ regex = re.compile('.+')
+
+ def __init__(self, name, paths=None):
+ """Initializes the Path instance
+
+ Args:
+ name (str): the name of the argument
+ paths (): ...
+ """
+ if paths is None:
+ paths = []
+
+ Named.__init__(self, name)
+ supcon.util.NamedList.__init__(self, paths)
+
+ def dump(self):
+ return {
+ 'name': self.name,
+ 'paths': [value.dump() for value in self.values()]
+ }
+
+ @classmethod
+ def load(cls, data) -> 'DPath':
+ return cls(**data)
+
+ def hasPath(self, path: str) -> bool:
+ return path in self
+
+ def hasIntf(self, path: str, intf: str) -> bool:
+ return path in self and intf in self[path]
+
+ def addPath(self, path: str) -> 'DNode':
+ if path in self:
+ raise ValueError('path {} on node {} already exists'.format(path, self.name))
+ paths = itertools.chain(self.values(), [DPath(path)])
+ return DNode(self.name, paths)
+
+ def delPath(self, path: str) -> 'DNode':
+ if path not in self:
+ raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+ if self[path]:
+ raise ValueError('path {} on node {} is not empty'.format(path, self.name))
+ paths = (v for v in self.values() if v.name != path)
+ return DNode(self.name, paths)
+
+ def addInterface(self, path: str, interface: DInterface) -> 'DNode':
+ if path not in self:
+ raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+ if interface.name in self[path]:
+ raise ValueError('interface {} at path {} on node {} already exists'.format(interface.name, path, self.name))
+ paths = (v for v in self.values() if v.name != path)
+ paths = itertools.chain(paths, [self[path].addInterface(interface)])
+ return DNode(self.name, paths)
+
+ def delInterface(self, path: str, interface: DInterface) -> 'DNode':
+ if path not in self:
+ raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+ if interface.name not in self[path]:
+ raise ValueError('interface {} at path {} on node {} does not exist'.format(interface.name, path, self.name))
+ paths = (v for v in self.values() if v.name != path)
+ paths = itertools.chain(paths, [self[path].delInterface(interface)])
+ return DNode(self.name, paths)
+
+
+class DNodes(supcon.util.NamedList):
+ """A readonly map of `supcon.intf.DNode` instances"""
+ vtype = DNode
+
+ def hasNode(self, node: str) -> bool:
+ return node in self
+
+ def hasPath(self, node: str, path: str) -> bool:
+ return node in self and path in self[node]
+
+ def hasIntf(self, node: str, path: str, intf: str) -> bool:
+ return node in self and path in self[node] and intf in self[node][path]
+
+ def addNode(self, node: str) -> 'DNodes':
+ if node in self:
+ raise ValueError('node {} already exists'.format(node))
+ nodes = itertools.chain(self.values(), [DNode(node)])
+ return DNodes(nodes)
+
+ def delNode(self, node: str) -> 'DNodes':
+ if node not in self:
+ raise ValueError('node {} does not exist'.format(node))
+ if self[node]:
+ raise ValueError('node {} is not empty'.format(node))
+ nodes = (v for v in self.values() if v.name != node)
+ return DNodes(nodes)
+
+ def addPath(self, node: str, path: str) -> 'DNodes':
+ if node not in self:
+ raise ValueError('node {} does not exist'.format(node))
+ nodes = (v for v in self.values() if v.name != node)
+ nodes = itertools.chain(nodes, [self[node].addPath(path)])
+ return DNodes(nodes)
+
+ def delPath(self, node: str, path: str) -> 'DNodes':
+ if node not in self:
+ raise ValueError('node {} does not exist'.format(node))
+ nodes = (v for v in self.values() if v.name != node)
+ nodes = itertools.chain(nodes, [self[node].delPath(path)])
+ return DNodes(nodes)
+
+ def addInterface(self, node: str, path: str, interface: DInterface) -> 'DNodes':
+ if node not in self:
+ raise ValueError('node {} does not exist'.format(node))
+ nodes = (v for v in self.values() if v.name != node)
+ nodes = itertools.chain(nodes, [self[node].addInterface(path, interface)])
+ return DNodes(nodes)
+
+ def delInterface(self, node: str, path: str, interface: DInterface) -> 'DNodes':
+ if node not in self:
+ raise ValueError('node {} does not exist'.format(node))
+ nodes = (v for v in self.values() if v.name != node)
+ nodes = itertools.chain(nodes, [self[node].delInterface(path, interface)])
+ return DNodes(nodes)
+
+
+class Implementation(object):
+ """The base class for interface implementations"""
+
+ def __init__(self, interface: DInterface):
+ """
+ Args:
+ interface (DInterface): the interface that is implemented by this Implementation
+ """
+ if not isinstance(interface, DInterface):
+ raise ValueError('interface must be an instance of {}'.format(DInterface))
+ self.__interface = interface
+
+ self.__callCbs = {}
+ self.__fireCbs = []
+
+ @property
+ def intf(self) -> str:
+ """str: The name of the implemented interface"""
+ return self.__interface.name
+
+ @property
+ def interface(self) -> DInterface:
+ """Interface: The implemented interface"""
+ return self.__interface
+
+ def setCallCb(self, method: str, cb):
+ """Sets a callback for the given method. The method must be a method of the
+ interface this Implementation implements. The callback must implement the
+ given method. The callback gets called by calls to Implementation.call()
+
+ Args:
+ method (str): the interface method that the callback implements
+ cb (callable): the callback
+ """
+ method = DMethod.toName(method)
+ if method in self.__callCbs:
+ raise ValueError('Callback for method {} is already set!'.format(method))
+ if method not in self.__interface.methods:
+ raise ValueError('Interface has no method {}!'.format(method))
+ self.__callCbs[method] = cb
+
+ def call(self, method: str, inArgs) -> defer.Deferred:
+ """Calls the given interface method with the given arguments. This method
+ calls the callback set by Implementation.setCallCb()
+
+ Args:
+ method (str): the called interface method
+ inArgs (Mapping): a map of input arguments
+ Returns:
+ defer.Deferred: Resolves with the result of the called method
+ """
+ def validateReturn(outArgs):
+ try:
+ self.__interface.validateReturn(method, outArgs)
+ except:
+ traceback.print_exc()
+ raise
+ return outArgs
+
+ try:
+ self.__interface.validateCall(method, inArgs)
+ if method not in self.__callCbs:
+ raise ValueError('Callback for method {} is not set!'.format(method))
+
+ d = self.__callCbs[method](**inArgs)
+ if not isinstance(d, defer.Deferred):
+ d = defer.succeed(d)
+ d.addCallback(validateReturn)
+ except BaseException as e:
+ traceback.print_exc()
+ d = defer.fail(e)
+
+ return d
+
+ def addFireCb(self, cb):
+ """Adds a callback that gets called, when this Implementation fires an
+ event.
+
+ Args:
+ cb (callable): the callback
+ """
+ self.__fireCbs.append(cb)
+
+ def delFireCb(self, cb):
+ """Removes a callback that gets called, when this Implementation fires an
+ event.
+
+ Args:
+ cb (callable): the callback
+ """
+ self.__fireCbs.remove(cb)
+
+ def fire(self, event: str, args):
+ """Fires the given event with the given arguments.
+
+ Args:
+ event (str): the event name
+ args (collecion.Mapping): the event arguments
+ """
+ self.__interface.validateEvent(event, args)
+
+ for cb in self.__fireCbs:
+ cb(event, args)
+
+
+class Object(object):
+
+ def __init__(self, interfaces=None):
+ """
+ Args:
+ interfaces (DInterfaces): the interfaces that are implemented by this Object
+ """
+ if interfaces is None:
+ interfaces = []
+
+ self.__intfs = {}
+ self.__impls = {}
+
+ for interface in interfaces:
+ if not isinstance(interface, DInterface):
+ raise ValueError('interface must be an instance of {}'.format(DInterface))
+ self.__intfs[interface.name] = interface
+
+ implementation = Implementation(interface)
+ self.__impls[implementation.intf] = implementation
+
+ @property
+ def interfaces(self):
+ return self.__intfs.values()
+
+ @property
+ def implementations(self):
+ return self.__impls.values()
+
+ def interface(self, intf):
+ return self.__intfs[intf]
+
+ def implementation(self, intf):
+ return self.__impls[intf]
+
+ def setCallCb(self, intf: str, method: str, cb):
+ self.__impls[intf].setCallCb(method, cb)
+
+ def fire(self, intf: str, event: str, args):
+ self.__impls[intf].fire(event, args)
+
+
+class Node(abc.ABC):
+ """The Node Interface. This class defines the methods that participants can
+ use to access the supcon bus."""
+
+ def __init__(self, name):
+ super().__init__()
+ self.__name = self.toName(name)
+
+ @property
+ def name(self) -> str:
+ """str: The name of the node on the bus"""
+ return self.__name
+
+ @classmethod
+ def toName(cls, value) -> str:
+ return DNode.toName(value)
+
+ @abc.abstractmethod
+ def nodes(self) -> DNodes:
+ """list[str]: The currently connected nodes"""
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def connect(self, endpoint):
+ """Connects the node to the given endpoint.
+
+ If the connection failes or closes the connection gets reestablished with an
+ exponential timeout up to two minutes.
+
+ Args:
+ endpoint (twisted.internet.interfaces.IStreamClientEndpoint):
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def listen(self, endpoint):
+ """Listens at the given endpoint for incoming connections
+
+ Args:
+ endpoint (twisted.internet.interfaces.IStreamServerEndpoint):
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def register(self, path: str, impl: Implementation):
+ """Registers an implementation with the node
+
+ Args:
+ impl (Implementation):
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def unregister(self, path: str, impl: Implementation):
+ """Removes an implementation from the node
+
+ Args:
+ impl (supcon.intf.Implementation):
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def call(self, node: str, path: str, intf: str, method: str, args: dict) -> defer.Deferred:
+ """Calls a method on the bus
+
+ Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ method (str): a method of the given interface
+ args (dict): a dict of method arguments
+
+ Returns:
+ defer.Deferred:
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def on(self, node: str, path: str, intf: str, event: str, cb):
+ """Registers a callback for an event on the bus
+
+ Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def off(self, node: str, path: str, intf: str, event: str, cb):
+ """Unregisters a callback for an event on the bus
+
+ Args:
+ node (str): a node on the bus
+ path (str): a path on the given node
+ intf (str): an interface at the given path
+ event (str): a method of the given interface
+ cb (callable): a callable that gets called with a dict of event arguments
+ """
+ raise NotImplementedError()
--- /dev/null
+
+class KeyedMethod():
+
+ def __init__(self, key, fget):
+ self.__key = key
+ self.__fget = fget
+ self.__doc__ = fget.__doc__
+
+ @property
+ def key(self):
+ return self.__key
+
+ @property
+ def fget(self):
+ return self.__fget
+
+ def __get__(self, obj, objType=None):
+ if obj is None:
+ return self
+ if self.__fget is None:
+ raise AttributeError("unreadable attribute")
+ return lambda *args, **kwargs: self.__fget(obj, *args, **kwargs)
+
+def lKeyedMethods(aClass):
+ """
+ Returns a dict of all KeyedMethods of the given class indexed by attribute
+ name. The dict does not contain the KeyedMethods of any super class.
+ """
+ if aClass is object:
+ return {}
+
+ lAttrs = vars(aClass)
+ if not '_lKeyedMethods' in lAttrs:
+ methods = {}
+ for name, attr in lAttrs.items():
+ if isinstance(attr, KeyedMethod):
+ methods[name] = attr
+ aClass._lKeyedMethods = methods
+ return aClass._lKeyedMethods
+
+def mKeyedMethods(aClass):
+ """
+ Returns a dict of all KeyedMethods of the given class indexed by attribute
+ name. The dict contains the KeyedMethods of all super classes that are not
+ hidden by the method resolution order.
+ """
+ if not '_mKeyedMethods' in vars(aClass):
+ methods = {}
+ for sClass in reversed(aClass.mro()):
+ methods.update(lKeyedMethods(sClass))
+ aClass._mKeyedMethods = methods
+ return aClass._mKeyedMethods
+
+def iKeyedMethods(aClass):
+ """
+ Returns a dict of all KeyedMethods of the given class indexed by key. The dict
+ contains the KeyedMethods of all super classes that are not hidden by the
+ method resolution order.
+ """
+ if not '_iKeyedMethods' in vars(aClass):
+ methods = {}
+ for _name, attr in mKeyedMethods(aClass).items():
+ if attr.key in methods:
+ raise ValueError()
+ methods[attr.key] = attr
+ aClass._iKeyedMethods = methods
+ return aClass._iKeyedMethods
+
+def keyedMethod(key):
+ """
+ Can be used to decorate a method with a key
+ """
+ return lambda fget: KeyedMethod(key, fget)
+
+def callKeyedMethod(obj, key, *args, **kwargs):
+ """
+ Resolves a keyed method by the given key and and calls it with the given
+ arguments.
+ """
+ return iKeyedMethods(type(obj))[key].__get__(obj)(*args, **kwargs)
--- /dev/null
+
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.threads as threads
+
+class Store(object):
+
+ def load(self, key: str) -> defer.Deferred:
+ pass
+
+ def store(self, key: str, data: bytes) -> defer.Deferred:
+ pass
+
+ def delete(self, key: str) -> defer.Deferred:
+ pass
+
+def readFile(name: str) -> defer.Deferred:
+ print('readFile')
+ def inThread():
+ print('readFile > inThread')
+ with open(name, 'r+b') as fd:
+ return fd.read()
+
+ return threads.deferToThread(inThread)
+
+def writeFile(name: str, data: bytes) -> defer.Deferred:
+ print('writeFile')
+ def inThread():
+ print('writeFile > inThread')
+ with open(name, 'w+b') as fd:
+ return fd.write(data)
+
+ return threads.deferToThread(inThread)
+
+class FileStore(Store):
+
+ def __init__(self, name):
+ self.__name = name
+ self.__data = {}
+ self.__last = self.__readData()
+
+ @defer.inlineCallbacks
+ def __readData(self):
+ data = yield readFile(self.__name)
+ data = msgpack.unpackb(data, encoding='utf-8')
+ if isinstance(data, dict):
+ self.__data = data
+
+ @property
+ def name(self):
+ return self.__name
+
+ def __queue(self, job) -> defer.Deferred:
+ d = defer.Deferred()
+
+ def trampolineSucceed(result):
+ if isinstance(result, defer.Deferred):
+ result.addCallbacks(trampolineSucceed, trampolineFail)
+ else:
+ d.callback(result)
+
+ def trampolineFail(result):
+ if isinstance(result, defer.Deferred):
+ result.addCallbacks(trampolineSucceed, trampolineFail)
+ else:
+ d.errback(result)
+
+ self.__last.addBoth(lambda _: job())
+ self.__last.addCallbacks(trampolineSucceed, trampolineFail)
+
+ return d
+
+ def load(self, key: str) -> defer.Deferred:
+ def job():
+ return self.__data[key] if key in self.__data else None
+ return self.__queue(job)
+
+ def store(self, key: str, data) -> defer.Deferred:
+ def job():
+ self.__data[key] = data
+ return writeFile(self.__name, msgpack.packb(self.__data, use_bin_type=True))
+ return self.__queue(job)
+
+ def delete(self, key: str) -> defer.Deferred:
+ def job():
+ if key in self.__data:
+ del self.__data[key]
+ return writeFile(self.__name, msgpack.packb(self.__data, use_bin_type=True))
+ return self.__queue(job)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import pigpio
+import supcon.util
+import supcon.intf
+
+""" the interface com.screwerk.Sensor """
+SensorIntf = supcon.intf.DInterface.load({
+ 'name':
+ 'com.screwerk.Sensor',
+ 'events': [{
+ 'name': 'changed',
+ 'args': [
+ {
+ 'name': 'value', 'description': 'The new sensor value'
+ }
+ ],
+ 'description': 'Fires when the sensor value changes'
+ }],
+ 'methods': [{
+ 'name': 'value',
+ 'outArgs': [
+ {
+ 'name': 'value', 'description': 'The sensor value'
+ }
+ ],
+ 'description': 'Returns the sensor value'
+ }]
+})
+
+""" the interface com.screwerk.Switch """
+SwitchIntf = supcon.intf.DInterface.load({
+ 'name': 'com.screwerk.Switch',
+ 'methods': [
+ {
+ 'name': 'on', 'description': 'Toggles the switch on'
+ }, {
+ 'name': 'off', 'description': 'Toggles the switch off'
+ }, {
+ 'name': 'toggle', 'description': 'Toggles the switch'
+ }
+ ]
+})
+
+
+def returnTrue(*args): return True
+def returnNone(*args): return None
+def returnFirst(*args): return args[0]
+
+
+class SoftSensor(object):
+ def __init__(self, value=None, guard=None, effect=None, convert=None):
+
+ self.__guard = guard or returnTrue
+ self.__effect = effect or returnNone
+ self.__convert = convert or returnFirst
+
+ self.__value = self.__convert(value)
+
+ self.__sensor = supcon.intf.Implementation(SensorIntf)
+ self.__sensor.setCallCb('value', lambda: {'value': self.__value})
+
+ @property
+ def value(self):
+ return self.__value
+
+ @property
+ def sensor(self):
+ return self.__sensor
+
+ def update(self, value):
+ value = self.__convert(value)
+ if self.__value == value:
+ return False
+ if not self.__guard(value, self):
+ return False
+
+ self.__value = value
+ self.__effect(value, self)
+ self.__sensor.fire('changed', {'value': value})
+ return True
+
+
+class SoftSwitch(SoftSensor):
+ def __init__(self, value=False, guard=None, effect=None, convert=None):
+ boolConvert = (lambda value: bool(convert(value))) if convert else bool
+ SoftSensor.__init__(self, value, guard, effect, boolConvert)
+
+ update = lambda value: {} if self.update(value) else {}
+ self.__switch = supcon.intf.Implementation(SwitchIntf)
+ self.__switch.setCallCb('on', lambda: update(True))
+ self.__switch.setCallCb('off', lambda: update(False))
+ self.__switch.setCallCb('toggle', lambda: update(not self.value))
+
+ @property
+ def switch(self):
+ return self.__switch
+
+
+class PiGPIOSensor(object):
+ def __init__(self, reactor, gpio):
+ self.__reactor = reactor
+ self.__gpio = gpio
+
+ self.__pi = pigpio.pi()
+ self.__pi.set_mode(self.__gpio, pigpio.INPUT)
+ self.__pi.set_glitch_filter(self.__gpio, 50000)
+ self.__pi.set_pull_up_down(self.__gpio, pigpio.PUD_UP)
+ self.__pi.callback(self.__gpio, pigpio.EITHER_EDGE, self.__callback)
+
+ self.__value = bool(self.__pi.read(self.__gpio))
+
+ self.__sensor = supcon.intf.Implementation(SensorIntf)
+ self.__sensor.setCallCb('value', lambda: {'value': self.__value})
+
+ @property
+ def sensor(self):
+ return self.__sensor
+
+ def __callback(self, gpio, level, tick):
+ if level >= 2:
+ return
+
+ self.__reactor.callFromThread(self.__update, bool(level))
+
+ def __update(self, value):
+ if self.__value == bool(value):
+ return
+
+ self.__value = bool(value)
+ self.__sensor.fire('changed', {'value': self.__value})
+
+
+class PiGPIOSwitch(SoftSwitch):
+ def __init__(self, gpio, guard=None, effect=None, convert=None):
+ self.__gpio = gpio
+
+ self.__pi = pigpio.pi()
+ self.__pi.set_mode(self.__gpio, pigpio.OUTPUT)
+
+ value = self.__pi.read(self.__gpio)
+
+ def writeEffect(value, switch):
+ self.__pi.write(self.__gpio, int(value))
+ if callable(effect):
+ effect(value, switch)
+
+ super().__init__(value, guard, writeEffect, convert)
+
+
+class NodeSensor(supcon.util.EventEmitter):
+
+ def __init__(self, local: supcon.intf.Node, node: str, path: str):
+ supcon.util.EventEmitter.__init__(self)
+
+ self.__local = local
+ self.__node = node
+ self.__path = path
+
+ self.__value = None
+
+ self.__local.on(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+ self.__local.on(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntfLost)
+ self.__local.on(self.node, self.path, 'com.screwerk.Sensor', 'changed', self.__onChanged)
+
+ if self.__local.nodes().hasIntf(self.node, self.path, 'com.screwerk.com'):
+ self.__fetchValue()
+
+ def __del__(self):
+ self.__local.off(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+ self.__local.off(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntfLost)
+ self.__local.off(self.node, self.path, 'com.screwerk.Sensor', 'changed', self.__onChanged)
+
+ @property
+ def node(self):
+ return self.__node
+
+ @property
+ def path(self):
+ return self.__path
+
+ @property
+ def value(self):
+ return self.__value
+
+ def __fetchValue(self):
+ self.__local.call(self.node, self.path, 'com.screwerk.Sensor', 'value', {}).addCallbacks(
+ lambda args: self.__update(args['value']),
+ lambda reason: self.__update(None)
+ )
+
+ def __update(self, value):
+ if self.__value == value:
+ return
+
+ self.__value = value
+ self.emit('changed', self.__value)
+
+ def __onIntf(self, args, event):
+ if (args.node == self.node and args.path == self.path and args.intf.name == 'com.screwerk.Sensor'):
+ self.__fetchValue()
+
+ def __onIntfLost(self, args, event):
+ if (args.node == self.node and args.path == self.path and args.intf.name == 'com.screwerk.Sensor'):
+ self.__update(None)
+
+ def __onChanged(self, args, event):
+ self.__update(args['value'])
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import abc
+
+import asyncio
+import collections
+import collections.abc
+
+import twisted.internet.defer
+
+def schedule(obj):
+ if asyncio.iscoroutine(obj):
+ obj = twisted.internet.defer.ensureDeferred(obj)
+ return obj
+
+class Dumpable(abc.ABC):
+ """
+ The abstract base class `supcon.util.Dumpable`.
+
+ Implementations of this abstract base class can be converted to and from
+ 'simple' datastructures containing only ints, floats, strings, lists and
+ dicts. These simple datastructures can be send and received by the supcon
+ bus. If you only ever use simple datastructures you can ignore this class.
+ """
+
+ @abc.abstractmethod
+ def dump(self):
+ """
+ Converts the `supcon.util.Dumpable` into a 'simple' datastructure.
+ """
+ pass
+
+ @abc.abstractclassmethod
+ def load(cls, data):
+ """
+ Converts the given 'simple' datastructure **data** into an instance of
+ **cls**, a subclass of `supcon.util.Dumpable`
+ """
+ pass
+
+
+class Named(abc.ABC):
+ """
+ The abstract base class `supcon.util.Named`.
+
+ Implementations of this abstract base class must have a property
+ `supcon.util.Named.name`, that can be used as a key in a dictionary.
+ """
+
+ @property
+ @abc.abstractmethod
+ def name(self) -> str:
+ """
+ The name of the instance. Is useable as a dictionary key.
+ """
+ pass
+
+
+class NamedList(collections.abc.Mapping, Dumpable):
+ """
+ A `supcon.util.NamedList` is an ordered, readonly dictionary of
+ `supcon.util.Named` and `supcon.util.Dumpable` elements of value type
+ `supcon.util.NamedList.vtype`.
+
+ The class `supcon.util.NamedList` itself can not be instantiated. It must be
+ subclassed and the class property `supcon.util.NamedList.vtype` set. The class
+ property `supcon.util.NamedList.vtype` denotes the type of the elements that
+ the list can contain. The type `supcon.util.NamedList.vtype` must be a
+ subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the
+ `supcon.util.NamedList.vtype` can be accessed by the values of their
+ `supcon.util.Named.name` property.
+ """
+
+ vtype = None
+ """
+ Must be assigned in a subclass of `supcon.util.NamedList` to a subclass
+ of `supcon.util.Named` and `supcon.util.Dumpable`
+ """
+
+ def __init__(self, values=None):
+ """
+ Initializes the `supcon.util.NamedList` with the given list of **values**.
+
+ An element of **values** must be of type `supcon.util.NamedList.vtype` or a
+ 'simple' datastructure that can be converted to an instance of
+ `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().
+ """
+ if values is None:
+ values = []
+ if not issubclass(self.vtype, Named):
+ raise ValueError('the value type must be a subclass of Named')
+ if not issubclass(self.vtype, Dumpable):
+ raise ValueError('the value type must be a subclass of Dumpable')
+
+ self.__values = collections.OrderedDict()
+
+ for value in values:
+ if not isinstance(value, self.vtype):
+ value = self.vtype.load(value)
+ if value.name in self.__values:
+ raise ValueError('value.name must be unique in the given list of values')
+ self.__values[value.name] = value
+
+ def __getitem__(self, key):
+ return self.__values[key]
+
+ def __iter__(self):
+ return iter(self.__values)
+
+ def __len__(self):
+ return len(self.__values)
+
+ def __repr__(self):
+ return "{}.{}({})".format(
+ self.__module__, self.__class__.__name__,
+ ', '.join([repr(v) for k, v in self.items()])
+ )
+
+ def dump(self):
+ """
+ Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.
+ """
+ return [value.dump() for value in self.values()]
+
+ @classmethod
+ def load(cls, data):
+ """
+ Converts the given list of 'simple' datastructures **data** into an instance
+ of **cls**, a subclass of `supcon.util.NamedList`.
+ """
+ return cls(data)
+
+ @classmethod
+ def to(cls, value):
+ """
+ If the the **value** is an instance of **cls**, a subclass of
+ `supcon.util.NamedList`, the value is returned. If value is not an instance
+ of **cls** the method tries to convert the **value** into an instance of
+ **cls**.
+ """
+ return value if isinstance(value, cls) else cls.load(value)
+
+
+class EventEmitter(object):
+
+ def __init__(self):
+ self.__callbacks = {}
+
+ def on(self, event, callback):
+ """
+ Registers the given callback for the given event
+ """
+ if type not in self.__callbacks:
+ self.__callbacks[event] = {}
+ self.__callbacks[event][id(callback)] = callback
+ return lambda: self.off(event, callback)
+
+ def off(self, event, callback):
+ """
+ Unregisters the given callback for the given event
+ """
+ if event not in self.__callbacks:
+ return
+ if id(callback) not in self.__callbacks[event]:
+ return
+ del self.__callbacks[event][id(callback)]
+
+ def emit(self, event, *args):
+ """
+ Calls all callbacks for the given event with the given arguments
+ """
+ if event not in self.__callbacks:
+ return
+ for callback in self.__callbacks[event].values():
+ schedule(callback(*args))