Repository navigation
v0.4.0
First release since 0.3.0, covering 81 commits.
PowerIO 0.11
Every bridge now runs on the typed PowerIO IR module model, and the dependency moves from powerio[mcp,matrix]>=0.9.0,<0.10 to >=0.11.2,<0.12 across all fourteen pin sites (#64).
This supersedes the <0.10 ceiling added in 0.3.1, which was a stopgap: PowerIO 0.11 removed the Package API that solver_case.py called, so the cap existed only to stop a fresh install resolving to a release the code could not use. The code now supports 0.11 properly, and the cap is gone.
pandapower, PyPSA, ANDES and Egret take powerio_ir, edits, to_balanced, base_mva, time_index and scenario_id. pandapower's hand-rolled PYPOWER-to-MATPOWER text projection is gone in favour of PowerIO's native writers. Every adapter response carries value_type, selection, diagnostics, warnings and, where the adapter converts, fidelity.
PowerIO 0.11.2 also confines MCP paths to the server's start directory when no root variable names one, where earlier versions allowed every path.
Upgrading: this is the significant change in the release. Anything pinning PowerMCP alongside its own powerio will need the newer floor.
PowerFactory
- Case-insensitive component lookup is fixed (#77, closes #73).
GetContentsname patterns turned out to be case-sensitive on PowerFactory 2026 SP1, so a lookup forBus Aagainst a storedbus areturned nothing before the Python comparison ever ran — breaking duplicate detection, bus selection and deletion. Name matching happens in Python again. - Contingency analysis (#78):
run_contingency_analysisexecutes the active study case's configuredComSimoutagewithout altering its definitions, andlist_contingenciesandget_contingency_resultsinspect fault cases and bounded AC/DC result slices read-only. A nonzero native code returns the same shape as a success, soexecution_codeis readable without parsing the message. - Deletion reports its result accurately and preserves diagram state (#66).
- Switchgear support, with circuit breakers created in endpoint cubicles (#63).
Python 3.13 and 3.14
The test matrix covers 3.10, 3.12, 3.13 and 3.14, and the classifiers match. requires-python is unchanged at >=3.10.
Every test suite now runs in CI
CI ran 302 tests at 0.3.0 and runs 445 now (439 on 3.10, where the optional surge-py is unavailable and its suite skips).
For most of the project's life only tests/ was collected, leaving the PowerFactory, HOPE, PSCAD, PLEXOSDB and surge suites invisible — and three of them had quietly rotted. All five now gate every change (#81):
- PSCAD needed its server directory on
sys.pathand thepscadextra for psutil. - PLEXOSDB and surge fixtures wrote to paths that PowerIO 0.11.2's confinement refuses, a latent consequence of the upgrade above.
- The surge groups tallied their sub-checks but returned the tally from
test_-named functions, so pytest discarded it — a group could report 3/4 and still be collected as a pass. The tally is asserted now, and groups needing a native HiGHS or Ipopt library skip when it is absent rather than failing.
Full changelog: v0.3.0...v0.4.0