All notable changes to the Python 3 Integration module for Ignition 8.3+.
Format: Based on Keep a Changelog Versioning: Semantic Versioning
- Installing Python 3.13 no longer fails:
PythonDistributionManager's tar-extraction per-file size cap was 100 MB, and 3.13'slibpython3.13.so.1.0is 103.7 MB. Raised the cap to 512 MB (total uncompressed cap raised in step, 500 MB → 1024 MB, so it stays >= the per-file cap) — both still refuse an oversized/zip-bomb-style tarball.
- Gateway Web UI now meets WCAG 2.1 AA across all six views (Dashboard, IDE, Scripts, Python Versions, Packages, Diagnostics): raised
--text-mutedoff Catppuccin overlay0 (measured 3.6-3.8:1) to overlay2, fixed the sidebar's active-item text and version tag contrast, raised every sub-11px text size to 11px, added a global:focus-visiblering so components that suppressoutlineon:focusstill show one, gave the code editor's comment colour and focus ring proper contrast plus anaria-labelon its actual textbox role, made the diagnostics log panel a focusable scrollable region, and added keyboard support (tabIndex+ Enter/Space) to every non-buttononClick— script rows, folder headers, script action icons, the inline pool-size editor and the PyPI search result expander. build.gradle.ktssyncVersionnow also coversweb-ui/src/components/Sidebar.tsx'sFALLBACK_MODULE_VERSION, which every prior release left stale.
- Package/distribution install/uninstall routes now require ADMIN/DESIGNER_ADMIN and CSRF validation, matching
/exec; previously any authenticated user could trigger arbitrary code via package build hooks.
SECURITY.mdnow lists the package and distribution endpoints as requiring authentication.
- Designer
rsyntaxtextarea/autocomplete/rstaui/flatlafmoved tomodlImplementationso they actually bundle into the.modlinstead of silently falling back to the platform's older copies; deadflatlafdependency removed entirely. - Designer
slf4j-apipinned to 2.0.12 to match the platform's actual bundled copy.
- Gson moved to
modlImplementation2.14.0;jakarta-servletbumped to 6.0.0;commons-compressto 1.28.0; test stack bumped tojunit-jupiter5.14.4,mockito5.23.0, with an explicitjunit-platform-launcher1.14.4 pin.
GatewayHookoverridesisMakerEditionCompatible()to return true, so the module now runs on Ignition Maker Edition.
- Dark-mode Script Console syntax colours are now built programmatically in Java instead of loading an XML theme resource that silently failed under the Designer's module classloader.
- Uninstalling an individually PyPI-installed package (not a catalogue bundle) now falls back to a direct pip uninstall instead of failing with "Failed to uninstall".
- Package install/uninstall now runs against every installed Python distribution, not just the default.
- Search-PyPI Install button now shows a spinner/progress toast during long installs.
- Saved scripts moved from a single
index.jsonblob to per-script.pyfiles +.meta.jsonsidecars with filesystem hot-reload (no module restart needed to pick up gateway-side edits). - Existing
index.jsonstores auto-migrate to the per-file layout on first startup. - Script signatures are now recomputed from file contents on load.
- In-app Help dialog in the Script Console explaining the full authoring/calling workflow.
- Diagnostics dialog showed frozen/fake data for execution stats, impact level, health score and Python 3 CPU%; all now sourced from live pool metrics.
- Pool size read as 0 in the Designer due to a field-name mismatch (
poolSizevstotalSize). datasciencebundle packages (numpy/pandas/matplotlib) failed to import under the memory cap because multi-threaded OpenBLAS reserved excessive virtual address space; single-threaded BLAS env vars now set and default memory cap raised to 2048 MB.- Script Console output was wiped on every run and the first run could be clipped; output now accumulates with newest first, and the pane opens at a readable split.
- Web UI package installs for any bundle except "jedi" failed with a missing-wheel error;
installPackagenow scans the module's actual bundled wheel directory as the source of truth and falls back to PyPI install for anything not bundled for the platform.
- A clean gateway with no system Python could never start the process pool: checksum pins for distribution downloads were never populated, and the tarball extractor's blanket symlink ban rejected legitimate in-tree symlinks required by real CPython distributions. Both fixed; absolute/escaping link targets are still refused.
- Deleted the unreachable legacy standalone
Python3IDEcluster (36 files, ~9,000 lines) — only ever instantiated by the dev test harness.
- Ctrl+F Find/Replace wired into the Script Console (previously implemented only in the deleted IDE cluster).
- Diagnostics dialog now follows the console's theme toggle live, and the Environment tab's tables/buttons/labels now re-theme correctly in light mode.
- Web UI Packages page always showed "0 installed / 0 total" because REST routes were mounted before the deferred-init thread created the package/pool managers; those services are now rewired into the live request context once created.
- Runtime
system.python3.*scripting is now allowed by default (previously deny-by-default); administrators can disable fleet-wide viaignition.python3.scriptingFunctions.allowed=false. - Designer exec/eval now use dedicated trusted RPC entry points that skip the runtime gate but keep full validation/audit.
- RPC gate hardened to also reject non-Designer client sessions.
- 8 new RPC methods mirroring the REST diagnostics/versions/distributions/completions endpoints.
- Diagnostics dialog and a read-only Environment tab added to the Script Console.
docs/getting-started/INTEGRATION_GUIDE.md.
- Designer slimmed by ~3,800 lines: Packages dialog, Python version install/uninstall dialog, Shell Command Mode/terminal, pool-size control and the Gateway-URL override setting removed — all owned by the Gateway web UI now.
- Jedi autocomplete now requires explicit Ctrl+Space with a 1.5s fetch cap; syntax-error squiggles restored via RPC.
- Designer "(Gateway unavailable)" / broken Project Browser and Script Console: the Designer's REST client carried no authenticated session. Designer↔Gateway calls now go over authenticated module RPC instead.
Python3Rpcmodule-RPC interface and gatewayPython3RpcHandlercovering script list/load/save/delete, exec/eval, version, pool stats and health.
- Subprocess stderr pipe-buffer deadlock: a dedicated stderr-drain thread now runs per executor so a chatty Python process can't fill the OS pipe buffer and block.
- Deleted the dead, unreachable
InputValidator"sandbox" (would have blocked legitimate Python 3 usage had it ever been wired in) and its tests. - Removed the redundant
EnhancedAuditLoggerand unused*WithContextexecutor methods. - Removed ~3,400 lines of confirmed-dead code:
AdaptivePoolSizer,ExecutorHealthMetrics,PriorityExecutionRequest,ExecutionPriority,ResultCache,ResourceLimits, standaloneRateLimiter.
- New
docs/architecture/ARCHITECTURE.mdwith Mermaid diagrams, replacing the staleOVERVIEW.md.
- Gateway web UI showed a stale version because
version.propertieswas only bundled intodesigner.jar, not on the gateway classpath. Moved to the common scope so both gateway and designer resolve the same file.
- Java packages renamed from
com.inductiveautomation.ignition.examples.python3.*tocom.gaskony.python3.*; any customer code referencing the old FQNs needs updating. RESTRICTEDexecution mode removed (bypassable AST filter); callers must migrate toNORMALand rely on OS-level isolation.
- Module ID unchanged; in-place upgrade keeps the same persisted state directory.
requiredFrameworkVersionchanged from"8.3"to"8"— the 8.3.6 module-XML parser treats it as an integer and rejected the old value, blocking install entirely.- Refreshed hardcoded version fallbacks in
DesignerHook.javaandInformationDialog.java.
- Moved test dependencies out of the root
subprojects {}block (version catalog accessors aren't available there) into gateway/designer build files.
- Standardised
auto-tag.ymlversion extraction andtsconfig.webpack.jsontest excludes to match the other modules; JaCoCo CSV output disabled.
- Accessibility baseline:
prefers-reduced-motion, skip link, accessible toast/Modalprimitives,jsx-a11ylint rule.
- Visibility-aware polling for
GlobalStatusBar(suspends when tab hidden). .gitignorestandardised to trackpackage-lock.json.- Documentation sweep: stale version references, dead links and Australian-English fixes.
Python3IDEgod class reduced from 3,854 to 646 lines via five extracted manager collaborators.
- Replaced the fake
RESTRICTEDsandbox with an Administrator role gate; removed the AST validator/filter and all silent-demotion paths.
pr-checks.ymlgained agradle-checkjob running JaCoCo/Checkstyle/SpotBugs; oneThread.sleepreplaced with Awaitility.
- Diagnostics log viewer with severity filtering; redesigned error boundary with retry.
- Cross-module CSS variable standardisation; async Gateway startup so process-pool warm-up no longer blocks boot; migrated to Ignition-bundled Gson.
- Blocked pip argument injection in package install/uninstall.
- Deleted the residual
execShellshell-injection sink. - Added tar-slip protection, size caps and pinned SHA-256 verification on package extraction.
/auth/sessiontokens now bound to the calling user's Ignition roles instead of "any authenticated user".- Hardened
.gitignoreagainst committing signing/credential files.
- Rolls up intermediate releases 3.12.2–3.12.11, which were not separately tagged.
- Flattened the Gradle project structure: moved
python3-integration/contents to the repository root; consolidated docs and CI path references.
- Aligned Designer IDE visual style with the other modules: card headers, bordered content sections, and a combined diagnostics+logs filter toolbar.
- Web UI package install/uninstall failed with 401 (only CSRF token sent, not the Bearer token); package catalog never showed installed status.
- Rewrote
Python3ScriptModule.propertiesscripting-function docs with usage guidance, examples, parameter types and common pitfalls; documented the previously-missinggetDistributionInfo.
- Gateway Web UI always showed a hardcoded stale module version because
/api/v1/versionnever returned amoduleVersionfield.
- Gateway-scope test coverage raised from 19% to 51.7% (649 tests across 17 classes).
- Extracted
CsrfProtectionandIpWhitelistinto independently-testable classes with dedicated tests.
Python3RestEndpointsreduced from ~1,338 to ~1,066 lines.
- Split
Python3RestEndpoints's 37 handler methods intoExecutionHandlers,ScriptAndPackageHandlersandMonitoringHandlers, plus a sharedEndpointContextdependency holder.
Python3RestEndpointsreduced from 3,177 to ~1,338 lines.
- Deleted the permanently-disabled
handleShellExecmethod (403-only since v2.9.0); its route constant remains so the path 404s cleanly.
withHandlerwrapper applying security headers and exception handling to all 41 REST endpoints, removing ~800 lines of duplicated try/catch/finally.
- New single-source-of-truth classes:
ApiEndpoints,JsonFields,PoolConfig(common scope);PreferenceKeys,ComponentThemeHelper,UiComponentFactory,Themeable,BaseModuleDialog(designer scope);ApiResponse(gateway scope).
- Removed
ThemeManager.applyDarkDialogTheme()/applyLightDialogTheme(), which set 50+ globalUIManagerkeys and polluted the whole Designer JVM; replaced with direct component-level colour calls. Rule established: never callUIManager.put()in this module. - Enriched
Python3ScriptModule.propertieswith full parameter/return documentation.
SectionPanelgained card-style gradient headers;DiagnosticsPanelnow implements aThemeableinterface; dark dialog implementations consolidated onto a common base.
ModernTheme.LIGHT_PRIMARY/LIGHT_SUCCESSsemantic colour constants.
InformationDialoghardcoded fonts replaced withModernThemeconstants.
- 32 new
ModernThemeconstants; all inlineColor/Fontconstruction across designer scope replaced with theme references.
- Duplicate Script Console appeared on Designer reopen (registered in both
setupProject()andstartup()). - Designer theme pollution scoped FlatLaf
UIManagercalls to module dialogs only. - CSRF for the Designer REST client fixed via an
X-Sourceheader bypass.
- Logs tab in diagnostics showing recent gateway log entries; floating card-style section headers.
- Version number missing from the Tools menu item.
PackagesDialoginfinite recursion crash (getRestClient()called itself).- Rename/delete popup dialogs appeared behind the Designer window for lack of a parent frame.
- Light-mode output text was too light; darkened and made theme-aware on switch.
- CSRF validation blocked Designer REST client operations (packages, delete, rename) when Bearer token acquisition failed;
X-Sourceheader now recognised as a secondary bypass. - Output text was unreadable in light mode; split-pane divider stayed dark in light mode; run button was taller than other toolbar buttons.
- Complete VS Code Dark+ palette overhaul across
ModernTheme, the RSTA syntax theme andInformationDialog; scrollbars made invisible.
- Theme toggle got stuck on light mode; script delete/rename failed (changed HTTP DELETE to POST for servlet compatibility); Packages dialog was inaccessible after IDE consolidation; version display showed a stale hardcoded value.
PackagesDialog(Frame, Python3RestClient)constructor and a Packages button on the Script Console toolbar.
- Package install/uninstall replaced a fragile subprocess-code workaround with proper REST endpoint calls.
- Script rename/delete failed for names with spaces/special characters; added URL decoding in gateway handlers.
- Script Console theme switching now updates all components consistently.
- PyPI install sent a malformed version string to pip; HTTP timeout raised to 5 minutes for large packages.
- Designer script/folder rename lacked an auth header, causing silent 403s.
- Project Browser's script tree collapsed every 30 seconds during auto-refresh; now diffs signatures before rebuilding.
- Dark theme reset to white on window creation due to a stray
updateComponentTreeUIcall.
- Light/dark theme toggle button on the Script Console, persisted across sessions.
- Script Console window had a white JFrame background under the dark theme; split-orientation toggle button was broken.
- Package install now falls back to direct PyPI download when a package isn't in the bundled catalogue.
- Removed the legacy "Python 3 IDE" menu entry; Script Console is now the single Designer entry point.
- Reverted a FlatLaf wrapping change that prevented the IDE and Script Console windows from opening.
- CSRF token validation failures on pool-size and package install fixed by generating the CSRF token before the API token.
- Packages catalog parsing error from a map-vs-array response mismatch.
- Full-width heading bar; logs pause/resume and a default module-name filter.
- Designer REST client authentication used the CSRF UUID as the Bearer token instead of the HMAC API token, breaking Script Console and Project Browser connectivity.
- Pool size control now surfaces HTTP error codes instead of always returning 200.
- Script Console UI given thinner scrollbars, softer borders and increased padding.
- Script Console crashed with a NullPointerException on theme apply (missing null checks for
JTextPane-based fields). - Designer Project Browser lost access after prior auth changes; Bearer tokens are now accepted.
- Folder creation now persists a placeholder script on the Gateway so folders survive a refresh; nested folder creation added.
- CSRF token validation broke the IDE, package install and pool resize; session endpoint now accepts the web-UI client ID.
- CSRF token expiry extended to match the 8-hour session token.
- PyPI metadata route was missing its
:namepath parameter. - Pool health status and
/healthendpoint status field were missing.
- All REST endpoints now require Gateway login; logs rewritten to read from the SQLite
system_logs.idb(works in Docker, unlikewrapper.log).
- Designer REST client blocked on auth-token failure, breaking Project Browser and Script Console;
ensureValidToken()is now non-throwing.
- Script Console redesigned to match the Web GUI with a merged output/error panel; split-orientation toggle added to both Designer and Web IDE.
- Logs tab with level filtering, search, pagination and auto-refresh; Save As button; inline pool-size control; expanded PyPI metadata search.
- Save button now auto-saves without prompting when a script is loaded.
- CPU/RAM metrics fixed to use
OperatingSystemMXBean/MemoryMXBeaninstead of inaccurate execution-ratio/heap-only calculations.
- Circuit Breaker and Active Alerts panels removed from Diagnostics (not useful data).
- "Python 3 Scripts" top-level node in the Designer's native Project Browser: browse, create, rename, delete and open scripts with context menus, auto-refresh and offline handling.
- New lightweight Designer Script Console (RSyntaxTextArea editor, theme toggle, version selector, load/save, output/error tabs, keyboard shortcuts).
- Full-text PyPI keyword search from the Gateway Web UI Packages tab.
- Status bar layout bled under the sidebar; CPU/RAM metrics showed zero due to a field-name mismatch.
- Non-functional Terminal tab and its xterm dependencies removed from the Gateway Web UI.
- Multi-version Python management: install/uninstall/manage Python 3.9–3.13 from the Designer IDE, with per-version process pools and a version selector in the toolbar.
- Repository renamed from
ignition-module-python3-javatoignition-module-python3; GitHub org references updated toGaskony-Ignition.
- Milestone release marking production maturity; no functional changes over v2.15.10.
- Package operations failed with "No such file or directory: 'pip3'"; switched to
sys.executable -m pipfor portability. - Drag-and-drop of a script onto a folder replaced the folder instead of moving into it.
- Script signature verification is now optional (
ignition.python3.enforce.signatures, default false) so old/invalid signatures don't block loading.
- Dead
execute_shellhandler inpython_bridge.pynow returns a proper error. - Memory leaks in CSRF token map, rate-limiter map and the static timeout executor thread pool.
- Timing-attack vulnerability in
secureEquals()(removed early exit on length mismatch).
- Bumped
commons-compressto 1.27.1 (CVE-2024-25710, CVE-2024-26308) andslf4jto 2.0.16; removedmockito-inline.
- Recent Scripts folder feature removed entirely, along with
RecentScriptsManager.
- Phantom "Recent" folder creation caused by an unnecessary tree refresh on script load.
- Recent-folder and metadata-panel display issues; improved folder navigation stability.
- Recent-folder persistence issue; script name was not visible in the UI.
- Phantom Recent-folder creation; context-menu actions no longer act on virtual folders.
- Reorganised Packages dialog into a two-column layout for better usability.
- Installed-packages table rendering issue fixed with a proper
TableCellRenderer/editor; experimental warning banner removed.
- Scrollable PyPI search results; functional installed-packages table with uninstall support.
- Virtual environment (venv) support with automatic detection and
VIRTUAL_ENVpropagation to Python subprocesses.
- Emoji button icons rendered as rectangles on some platforms; replaced with Unicode symbols.
- Settings dialog layout and button truncation; Packages dialog scrolling scoped to just the table; button/connection-status icons rendered as rectangles.
- Script creation now requires metadata input before the script is created.
- Smoke tests for all 7 manager classes (184 tests total).
- Extracted 7 manager classes (
AutoSaveManager,SearchManager,ScriptImportExportManager,ExecutionManager,KeyboardShortcutsManager,ScriptTransferManager,CommandPaletteManager) via dependency injection.
Python3IDE.javareduced from 4,390 to 3,727 lines.
- Converted 8 data classes to Java 17 records for immutability and reduced boilerplate.
- Critical security fixes; enhanced input validation and sanitisation.
- Batch-updated dependencies to latest secure versions.
- Command Palette (Ctrl+Shift+P); Recent Scripts quick access; enhanced button hierarchy; collapsible sidebar (Ctrl+B); inline AST-based syntax error markers; smart auto-save every 30 seconds.
- Settings dialog with theme/font controls; Info dialog; Packages dialog; Web UI theme matching.
- Dialog theming consistency and font-size persistence across sessions.
- AST-based Python syntax validation; Designer IDE
DESIGNER_ADMINmode integration.
- Role-based access control checks added before code execution.
RTextScrollPanegutter border colour issue; reverted the v2.5.25 change that caused a visual regression.
- Attempted fix for white-rectangle UI artifacts; introduced a gutter-border regression (fixed in 2.5.26).
- Focus-border and editor-border visual artifacts; tab repositioning.
- Execution mode tabs (Code / Terminal).
- CPU-percentage display accuracy.
- RAM/CPU data parsing from process statistics;
RTextScrollPanewhite-rectangle artifact.
- RAM and CPU metrics in the diagnostics panel.
- Tab-switching behaviour; removed
TitledBorderusage for consistency.
- Custom tab component with zero-gap borders.
- Various white-line/border artifacts and component spacing/theme-consistency issues.
- Interactive shell mode (Python REPL) with command history.
- Shell Command Mode for terminal commands with pip integration.
- Theme system fixes; Python version detection rebuilt.
- Enhanced logging for debugging; file-chooser theme consistency.
- Experimental v2 code path removed and consolidated into the main implementation.
DarkDialogbase class for theme-aware dialogs throughout the IDE.
- Complete architecture refactor from the v1.x monolith: main class reduced from 2,676 to 490 lines, split into managers, UI panels and orchestration.
- Final v1.x release before the v2.0.0 refactor.
For version history prior to v1.17.2, see git commit history:
git log --oneline --all --before="2024-11-30"MAJOR.MINOR.PATCH (Semantic Versioning)
- MAJOR (x.0.0): Breaking changes, major new features, architectural changes
- MINOR (1.x.0): New features, significant fixes, scope changes, API additions
- PATCH (1.0.x): Bug fixes, documentation updates, minor tweaks
- Repository: https://github.com/Gaskony-Ignition/ignition-module-python3
- Documentation: python3-integration/docs/
- Architecture: python3-integration/docs/V2_ARCHITECTURE_GUIDE.md
- Testing: python3-integration/docs/TESTING_GUIDE.md