Skip to content

Commit

Permalink
Merge pull request #415 from byllyfish/cleanup
Browse files Browse the repository at this point in the history
Update dev. dependencies. Fix pyright and ruff lint warnings.
  • Loading branch information
byllyfish authored Jan 28, 2024
2 parents 43287ee + bca24ef commit 4c4ab01
Show file tree
Hide file tree
Showing 11 changed files with 174 additions and 148 deletions.
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ name: ci
on:
push:
branches: [ "*" ]

schedule:
# Every day at 2:34.
- cron: '34 2 * * *'

permissions:
contents: read

Expand Down
2 changes: 1 addition & 1 deletion ci/requirements-demonet.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Poetry (version 1.7.1) export at Fri Jan 19 19:48:28 MST 2024
# Poetry (version 1.7.1) export at Sat Jan 27 14:27:45 MST 2024
pygraphviz==1.12 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:8b0b9207954012f3b670e53b8f8f448a28d12bdbbcf69249313bd8dbe680152f
120 changes: 60 additions & 60 deletions ci/requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Poetry (version 1.7.1) export at Fri Jan 19 19:48:28 MST 2024
# Poetry (version 1.7.1) export at Sat Jan 27 14:27:45 MST 2024
astroid==3.0.2 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91 \
--hash=sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c
Expand Down Expand Up @@ -31,59 +31,59 @@ click==8.1.7 ; python_version >= "3.10" and python_version < "4.0" \
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "win32" or platform_system == "Windows") \
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
coverage[toml]==7.4.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \
--hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \
--hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \
--hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \
--hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \
--hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \
--hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \
--hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \
--hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \
--hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \
--hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \
--hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \
--hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \
--hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \
--hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \
--hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \
--hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \
--hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \
--hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \
--hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \
--hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \
--hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \
--hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \
--hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \
--hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \
--hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \
--hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \
--hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \
--hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \
--hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \
--hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \
--hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \
--hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \
--hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \
--hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \
--hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \
--hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \
--hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \
--hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \
--hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \
--hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \
--hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \
--hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \
--hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \
--hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \
--hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \
--hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \
--hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \
--hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \
--hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \
--hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \
--hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06
coverage[toml]==7.4.1 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61 \
--hash=sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1 \
--hash=sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7 \
--hash=sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7 \
--hash=sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75 \
--hash=sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd \
--hash=sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35 \
--hash=sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04 \
--hash=sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6 \
--hash=sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042 \
--hash=sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166 \
--hash=sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1 \
--hash=sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d \
--hash=sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c \
--hash=sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66 \
--hash=sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70 \
--hash=sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1 \
--hash=sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676 \
--hash=sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630 \
--hash=sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a \
--hash=sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74 \
--hash=sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad \
--hash=sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19 \
--hash=sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6 \
--hash=sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448 \
--hash=sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018 \
--hash=sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218 \
--hash=sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756 \
--hash=sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54 \
--hash=sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45 \
--hash=sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628 \
--hash=sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968 \
--hash=sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d \
--hash=sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25 \
--hash=sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60 \
--hash=sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950 \
--hash=sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06 \
--hash=sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295 \
--hash=sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b \
--hash=sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c \
--hash=sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc \
--hash=sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74 \
--hash=sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1 \
--hash=sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee \
--hash=sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011 \
--hash=sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156 \
--hash=sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766 \
--hash=sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5 \
--hash=sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581 \
--hash=sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016 \
--hash=sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c \
--hash=sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3
dill==0.3.7 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \
--hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03
Expand Down Expand Up @@ -267,9 +267,9 @@ pdoc==14.4.0 ; python_version >= "3.10" and python_version < "4.0" \
platformdirs==4.1.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380 \
--hash=sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420
pluggy==1.3.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \
--hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7
pluggy==1.4.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981 \
--hash=sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be
prometheus-client==0.19.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1 \
--hash=sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92
Expand All @@ -294,9 +294,9 @@ pygments==2.17.2 ; python_version >= "3.10" and python_version < "4.0" \
pylint==3.0.3 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b \
--hash=sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810
pyright==1.1.347 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:14dd31b594aa3ec464894f66b8a2d206ebef1501e52789eb88cf2a79b0907fbe \
--hash=sha256:17ea09322f60080f82abc4e622e43d1a5ebaa407ba86963b15b2bc01cca256e0
pyright==1.1.348 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:1c6994546f7ab130b9da8c357f8b2a99bef268b6d8ae2eae292bde66923aa7af \
--hash=sha256:e7d4df504c4c082b5c3725a8c15fc3fda62da5d09fc77994baa77f359a1b62f2
pytest-asyncio==0.21.1 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d \
--hash=sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b
Expand Down
2 changes: 1 addition & 1 deletion ci/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Poetry (version 1.7.1) export at Fri Jan 19 19:48:28 MST 2024
# Poetry (version 1.7.1) export at Sat Jan 27 14:27:45 MST 2024
grpcio==1.60.0 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6 \
--hash=sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328 \
Expand Down
6 changes: 4 additions & 2 deletions examples/gnmi/demo3.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ async def main():
print(f"initial: {update.path['name']} is {update.value}")

# Run a background task to toggle the interface status.
_task = asyncio.create_task(toggle_enabled(names))
task = asyncio.create_task(toggle_enabled(names))

# Listen for status updates.
# Listen for status updates (infinite loop).
async for update in sub.updates():
print(f"update: {update.path['name']} is {update.value}")

task.cancel()


async def toggle_enabled(names: list[str]):
"Repeatedly disable and enable interfaces using a separate GNMI client."
Expand Down
6 changes: 3 additions & 3 deletions finsy/p4entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,19 +202,19 @@ class _P4Writable(P4Entity):

def __pos__(self) -> Self:
if self._update_type != P4UpdateType.UNSPECIFIED:
raise ValueError(f"update type already specified")
raise ValueError("update type already specified")
self._update_type = P4UpdateType.INSERT
return self

def __neg__(self) -> Self:
if self._update_type != P4UpdateType.UNSPECIFIED:
raise ValueError(f"update type already specified")
raise ValueError("update type already specified")
self._update_type = P4UpdateType.DELETE
return self

def __invert__(self) -> Self:
if self._update_type != P4UpdateType.UNSPECIFIED:
raise ValueError(f"update type already specified")
raise ValueError("update type already specified")
self._update_type = P4UpdateType.MODIFY
return self

Expand Down
8 changes: 4 additions & 4 deletions finsy/p4schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ class _P4AnnoMixin:
_annotations: list["P4Annotation"]

def __init__(self, pbuf: Any):
super().__init__(pbuf) # pyright: ignore[reportGeneralTypeIssues]
super().__init__(pbuf) # pyright: ignore[reportCallIssue]
self._annotations = _parse_annotations(pbuf)

@property
Expand Down Expand Up @@ -2127,14 +2127,14 @@ def __init__(self):
def get(self, key: tuple[str, str] | tuple[int, int]) -> P4ExternInstance | None:
"Retrieve item by name. Return None if not found."
if isinstance(key[0], int):
return self._by_id.get(key) # pyright: ignore[reportGeneralTypeIssues]
return self._by_name.get(key) # pyright: ignore[reportGeneralTypeIssues]
return self._by_id.get(key) # pyright: ignore[reportArgumentType]
return self._by_name.get(key) # pyright: ignore[reportArgumentType]

def __getitem__(self, key: tuple[str, str] | tuple[int, int]) -> P4ExternInstance:
value = self.get(key)
if value is None:
self._key_error(key)
return value # pyright: ignore[reportGeneralTypeIssues]
return value # pyright: ignore[reportReturnType]

def __iter__(self) -> Iterator[P4ExternInstance]:
return iter(self._by_name.values())
Expand Down
6 changes: 3 additions & 3 deletions finsy/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ def _sigterm_cancel_task(task: asyncio.Task[Any]) -> None:

async def _finsy_boilerplate(coro: Coroutine[Any, Any, None]):
"Wrap main async function and implement boilerplate."

# Activate logging.
logging.basicConfig(
level=logging.INFO,
format="%(created).03f %(levelname)s %(name)s %(message)s",
)

if sys.platform != "win32":
# Boilerplate to shutdown cleanly upon SIGTERM signal.
current_task = asyncio.current_task()
assert current_task is not None
asyncio.get_running_loop().add_signal_handler(
signal.SIGTERM,
_sigterm_cancel_task,
asyncio.current_task(),
current_task,
)

# Enable caching of P4Info definitions.
Expand Down
47 changes: 34 additions & 13 deletions finsy/test/demonet.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,37 @@
from ipaddress import IPv4Network, IPv6Network
from pathlib import Path
from types import TracebackType
from typing import Any, ClassVar, Sequence
from typing import Any, ClassVar, Protocol, Sequence

from shellous import Command, Prompt, sh

from finsy import MACAddress

try:
import pygraphviz as pgv # type: ignore
except ImportError:
pgv = None

class GraphAPI(Protocol):
"""Protocol implemented by pygraphviz Graph.
pygraphviz is an optional dependency; this Protocol facilitates typing.
"""

def __init__(self, **attr: Any):
...

def add_node(self, n: Any, **attr: Any) -> None:
...

def add_edge(self, u: Any, v: Any, **attr: Any) -> None:
...

def layout(self) -> None:
...

def draw(self, path: str | None) -> bytes | None:
...

def to_string(self) -> str:
...


# pyright: reportUnknownMemberType=false

Expand Down Expand Up @@ -237,20 +258,20 @@ def _json_default(obj: object):
return str(obj)

try:
return asdict(obj) # pyright: ignore[reportGeneralTypeIssues]
return asdict(obj) # pyright: ignore[reportArgumentType]
except TypeError as ex:
raise ValueError(
f"DemoNet can't serialize {type(obj).__name__!r}: {obj!r}"
) from ex

def to_graph(self) -> "pgv.AGraph":
def to_graph(self) -> GraphAPI:
"Create a pygraphviz Graph of the network."
if pgv is None:
raise RuntimeError("ERROR: pygraphviz is not installed.")
try:
import pygraphviz as pgv # type: ignore
except ImportError:
raise RuntimeError("ERROR: pygraphviz is not installed.") from None

graph = pgv.AGraph(
**_PyGraphStyle.graph, # pyright: ignore[reportGeneralTypeIssues]
)
graph = pgv.AGraph(**_PyGraphStyle.graph)

for item in self.items:
match item:
Expand Down Expand Up @@ -611,7 +632,7 @@ def _get_local_ipv4_address():
class _PyGraphStyle:
"Style defaults for different graphviz elements."

graph: ClassVar[dict[str, str]] = dict(
graph: ClassVar[dict[str, Any]] = dict(
bgcolor="lightblue",
margin="0",
pad="0.25",
Expand Down
Loading

0 comments on commit 4c4ab01

Please sign in to comment.