chore: prepare v1.4.6 release on JDK 25 - #1
emmanuelbruno wants to merge 49 commits into
Conversation
- Use %%compile for all compilation examples - Add Lombok example and Greeter demo - Fix %%write usage and reorder notebook
… obtaining Connection
- Add centralized utilities (OptionUtils, PathResolver, OutputUtils) - Implement javasrc* magics with full feature set: - javasrcMethodByName/ByAnnotationName with regex, selection, --help - javasrcClassByName, javasrcInterfaceByName with FQCN auto-resolve - javasrcList for source file summaries - Support --raw/--fenced output, --src path resolution - Enhance database magics (JavaDBMSMagics): - rdbmsSchema: SVG/PNG, showSource, include/exclude filters, scale, handwritten - sqlAsTable: HTML/CSV formats, max rows, showQuery, LIMIT/OFFSET normalization - Improve connection handling and JDBC driver registration - Improve PlantUML magics: - Support showSource/-s flag for debugging - Clean SVG output (strip XML declaration) - Better error context - Fix MagicsTool %load: - Workspace-relative path resolution - Quiet logging (no stdout noise) - Graceful not-found handling - Add sample Java files for demos (Greeter, OrderExample) - Add comprehensive magics audit document with improvement roadmap - Update example notebook with DBMS and javasrc examples BREAKING: --help short-circuits before any file I/O (prevents spurious builds) Closes phase 1 of magics refactor. See MAGICS_AUDIT_AND_IMPROVEMENT_PLAN.md for next steps.
…ke/ and conn file)
…nto venv (sys-prefix)
…own and tests; remove MyShellMagics
… names; remove deprecated mycompile alias
…ptions support; add JavaCompilerMagicsTest
…on processors via JavaCompilerMagics
…r magics and update demos
Apply the pre-audit workspace changes: license header sweep to ebpro, move audit docs into docs/, drop notebooks/out artifacts and the stray build copy.gradle, document magics, set the 60s default statement timeout, and add the SOTA 2026 audit plan (docs/UPGRADE-2026.md).
Replace the Maven basekernel dependency with a local Gradle module, move the IJava-specific BaseKernel/StringStyler/TextColor classes into that module, align the Guava annotation stack, and harden Shadow duplicate handling.
There was a problem hiding this comment.
🟡 Changes recommended
There are multiple confirmed correctness issues (malformed URL rendering HTML, incorrect PublishStatus JSON key, and several NPE/crash edge cases) that should be fixed before release testing.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Prepares the IJava v1.4.6 release candidate for manual testing by upgrading the build toolchain (JDK/Gradle), vendoring jupyter-jvm-basekernel as a local Gradle module, and hardening packaging/installation and kernel metadata handling.
Changes:
- Vendored
jupyter-jvm-basekernelintobasekernel/and wired it into the main build. - Upgraded to JDK 25 / Gradle 9.7.1, adjusted Shadow JAR + resource filtering, and updated distribution naming.
- Hardened kernel installation and added/updated magics + tests (shell, compiler, annotation processor, duplicate magic detection).
File summaries
| File | Description |
|---|---|
| UPGRADE.md | Adds v1.4.6 highlights, requirements, and upgrade instructions. |
| src/test/java/io/github/spencerpark/ijava/magics/SingleShellMagicsTest.java | Updates tests to cover persistent shell magics returning output. |
| src/test/java/io/github/spencerpark/ijava/magics/ShellMagicsTest.java | Adds shell magic tests (echo, timeout, executor shutdown). |
| src/test/java/io/github/spencerpark/ijava/magics/JavaCompilerMagicsTest.java | Adds a compile magic test that verifies a .class file is produced. |
| src/test/java/io/github/spencerpark/ijava/magics/DuplicateMagicsTest.java | Adds a scan-based test to detect duplicate @CellMagic names/aliases. |
| src/test/java/io/github/spencerpark/ijava/magics/DBMSMagicsIntegrationTest.java | Replaces a removed integration test with a placeholder note. |
| src/test/java/io/github/spencerpark/ijava/magics/AnnotationProcessorIntegrationTest.java | Adds an annotation-processor integration test via compile magic. |
| src/main/resources/print.jshell | Replaces templated copyright author token. |
| src/main/resources/kernel.json | Switches kernel argv jar template to ${project}-${version}-all.jar. |
| src/main/resources/kernel-metadata.json | Adds kernel metadata template (project/version). |
| src/main/resources/install.py | Fixes --replace, safely JSON-escapes install path, and rewrites argv jar path. |
| src/main/resources/ijava-kernel-metadata.json | Switches metadata tokens to ${...} template style. |
| src/main/java/io/github/spencerpark/ijava/utils/RuntimeCompiler.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/utils/ResolveDependency.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/utils/FileUtils.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/runtime/Magics.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/runtime/Kernel.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/runtime/Display.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/magics/TimeItMagics.java | Refactors timing magic to warmup/iterations + nanoTime statistics. |
| src/main/java/io/github/spencerpark/ijava/magics/SingleShellMagics.java | Adds --help handling and null-arg guards for persistent shell magics. |
| src/main/java/io/github/spencerpark/ijava/magics/PrinterMagics.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/magics/PathResolver.java | Adds utility to resolve source file paths for FQCNs (with fallback scan). |
| src/main/java/io/github/spencerpark/ijava/magics/OutputUtils.java | Adds helper to display raw vs fenced markdown output. |
| src/main/java/io/github/spencerpark/ijava/magics/OptionUtils.java | Adds option parsing helpers for magics. |
| src/main/java/io/github/spencerpark/ijava/magics/MyShellMagics.java | Deprecates and removes magic registration from legacy shell magic class. |
| src/main/java/io/github/spencerpark/ijava/magics/JavaPlantUMLMagics.java | Adds help/show-source options and improves SVG extraction + file handling. |
| src/main/java/io/github/spencerpark/ijava/magics/CompilerMagics.java | Adds --help handling for compile magic entry point. |
| src/main/java/io/github/spencerpark/ijava/magics/ClasspathMagics.java | Adds help output + classpath snapshot magic with lastModified info. |
| src/main/java/io/github/spencerpark/ijava/IJava.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/MagicsSourceTransformer.java | Adds fallback transform for %%magic lines without a parsed body. |
| src/main/java/io/github/spencerpark/ijava/execution/LazyOutputStreamDelegate.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/LazyInputStreamDelegate.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/IncompleteSourceException.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/IJavaExecutionControlProvider.java | Sets a default per-statement timeout and updates timeout defaults. |
| src/main/java/io/github/spencerpark/ijava/execution/IJavaExecutionControl.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/EvaluationTimeoutException.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/EvaluationInterruptedException.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/CompilationException.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/CodeEvaluatorBuilder.java | Replaces templated copyright author token. |
| src/main/java/io/github/spencerpark/ijava/execution/CodeEvaluator.java | Replaces templated copyright author token. |
| settings.gradle | Includes the new basekernel module and updates Java version checks. |
| gradlew.bat | Updates Windows Gradle wrapper script to a newer standard version. |
| gradle/wrapper/gradle-wrapper.properties | Upgrades Gradle wrapper to 9.7.1 with new SHA256. |
| docs/sample_java/com/example/SayHello.java | Adds sample Java interface for docs/examples. |
| docs/sample_java/com/example/Product.java | Adds sample Java class for docs/examples. |
| docs/sample_java/com/example/OrderExample.java | Adds sample Java class with Javadoc/deprecation examples. |
| docs/sample_java/com/example/Greeter.java | Adds sample Java class with simple Javadoc. |
| docs/notebooks/sample_java/com/example/SayHello.java | Adds notebook sample Java interface. |
| docs/notebooks/sample_java/com/example/Product.java | Adds notebook sample Java class. |
| docs/notebooks/sample_java/com/example/OrderExample.java | Adds notebook sample Java class. |
| docs/notebooks/sample_java/com/example/Greeter.java | Adds notebook sample Java class. |
| build.gradle | Upgrades toolchain to JDK 25, switches Shadow plugin, vendors basekernel module, hardens packaging/resources. |
| basekernel/src/test/java/io/github/spencerpark/jupyter/kernel/util/InheritanceIteratorTest.java | Adds parameterized tests for type-iteration order. |
| basekernel/src/test/java/io/github/spencerpark/jupyter/kernel/magic/registry/StaticMagics.java | Adds test helper magics to validate static magic registration. |
| basekernel/src/test/java/io/github/spencerpark/jupyter/kernel/display/RenderRequestTypesResolutionTest.java | Adds tests for supported MIME type resolution behavior. |
| basekernel/src/test/java/io/github/spencerpark/jupyter/kernel/display/mime/MIMETypeTest.java | Adds tests for MIME type parsing correctness. |
| basekernel/src/main/resources/kernel-metadata.json | Adds basekernel resource token template for metadata. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/RequestType.java | Adds request typing interface for message modeling. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/ReplyType.java | Adds reply typing interface for message modeling. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/ShutdownRequest.java | Adds message model for shutdown request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/KernelInfoRequest.java | Adds message model for kernel info request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/IsCompleteRequest.java | Adds message model for is-complete request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/InterruptRequest.java | Adds message model for interrupt request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/InspectRequest.java | Adds message model for inspect request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/InputRequest.java | Adds message model for stdin input request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/HistoryRequest.java | Adds message model for history request (range/tail/search). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/ExecuteRequest.java | Adds message model for execute request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/CompleteRequest.java | Adds message model for completion request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/request/CommInfoRequest.java | Adds message model for comm-info request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/ShutdownReply.java | Adds reply model for shutdown request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/KernelInfoReply.java | Adds reply model for kernel info request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/IsCompleteReply.java | Adds reply model for is-complete request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/InterruptReply.java | Adds reply model for interrupt request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/InspectReply.java | Adds reply model for inspect request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/InputReply.java | Adds reply model for stdin input request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/HistoryReply.java | Adds reply model for history request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/ExecuteReply.java | Adds reply model for execute request. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/ErrorReply.java | Adds error reply model + stacktrace capture. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/CompleteReply.java | Adds completion reply model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/reply/CommInfoReply.java | Adds comm-info reply model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishUpdateDisplayData.java | Adds iopub publish message for display updates. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishStream.java | Adds iopub publish message for stdout/stderr streams. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishStatus.java | Adds iopub publish message for kernel status. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishExecuteResult.java | Adds iopub publish message for execution result. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishExecuteInput.java | Adds iopub publish message for execution input. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishError.java | Adds iopub publish message for errors with formatter hook. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishDisplayData.java | Adds iopub publish message for display data. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/PublishClearOutput.java | Adds iopub publish message for output clearing. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/publish/ErrorFormatter.java | Adds functional interface for formatting stack traces. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/MessageContext.java | Adds message context interface (identities + header). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/Message.java | Adds message container model (header/content/metadata/blobs). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/KernelTimestamp.java | Adds lazy timestamp parsing/serialization helper. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/HMACGenerator.java | Adds message signature generator implementation. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/Header.java | Adds header model for Jupyter messages. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/ContentType.java | Adds interface for message content with a MessageType. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/comm/CommOpenCommand.java | Adds comm_open command content model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/comm/CommMsgCommand.java | Adds comm_msg command content model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/comm/CommCloseCommand.java | Adds comm_close command content model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/ReplyTypeAdapter.java | Adds reply deserializer that detects error replies by status. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/PublishStatusAdapter.java | Adds PublishStatus deserializer (but currently keyed incorrectly). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/MessageTypeAdapter.java | Adds serializer/deserializer for MessageType. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/KernelTimestampAdapter.java | Adds serializer/deserializer for KernelTimestamp. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/IdentityJsonElementAdapter.java | Adds JsonElement adapter that forces null serialization. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/HistoryRequestAdapter.java | Adds polymorphic deserializer for HistoryRequest variants. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/HistoryEntryAdapter.java | Adds serializer for HistoryEntry tuple format. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/HeaderAdapter.java | Adds serializer/deserializer for Header JSON shape. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/messages/adapters/ExpressionValueAdapter.java | Adds serializer/deserializer for ExpressionValue success/error. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/util/TextColor.java | Updates copyright header token. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/util/StringStyler.java | Updates copyright header token. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/util/StringSearch.java | Adds identifier-range finder for completions/analysis. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/util/SimpleAutoCompleter.java | Adds prefix-based autocomplete helper. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/util/InheritanceIterator.java | Adds iterator for class/interface traversal without duplicates. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/ReplacementOptions.java | Adds container for replacement results with source ranges. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/UndefinedMagicException.java | Adds exception for missing magic resolution. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/MagicArgsParseException.java | Adds args-parse exception type. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/LineMagicFunction.java | Adds functional interface for line magics. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/LineMagic.java | Adds annotation for line magic methods. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/CellMagicFunction.java | Adds functional interface for cell magics. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/registry/CellMagic.java | Adds annotation for cell magic methods. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/MagicParser.java | Adds parser/transformer for % / %% magics. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/LineMagicParseContext.java | Adds context model for line magic parsing/transform. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/LineMagicArgs.java | Adds line magic args model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/common/WriteFile.java | Adds common writefile cell magic. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/common/Shell.java | Adds common shell line magic to run external commands. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/common/DisplayMagics.java | Adds common display cell magics (html/markdown/svg/latex/js). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/CellMagicParseContext.java | Adds context model for cell magic parsing/transform. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/magic/CellMagicArgs.java | Adds cell magic args model (name/args/body). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/KernelConnectionProperties.java | Adds connection file model + HMAC generator creation. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/JupyterIO.java | Adds stdio + display stream wiring for shell environments. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/history/HistoryEntry.java | Adds history entry model. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/ExpressionValue.java | Adds user-expression result model (success/error). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/DisplayStream.java | Adds wrapper for publishing display data over iopub. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/RenderParams.java | Adds helper for building render parameter maps. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/RenderFunction.java | Adds functional interface for rendering. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/RenderContext.java | Adds render context for request-type negotiation and params. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/MIMESuffixAssociation.java | Adds suffix-to-delegate MIME association interface. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/mime/MIMETypeParseException.java | Adds MIME parse exception type. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/mime/MIMESuffix.java | Adds known MIME suffix definitions and lookup. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/mime/MIMESubtype.java | Adds subtype tree helpers. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/mime/MIMEGroup.java | Adds MIME group model and canonicalization. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/DisplayDataRenderable.java | Adds interface for renderable objects with supported types. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/common/Url.java | Adds URL renderer for HTML embedding (currently malformed output). |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/common/Text.java | Adds char-sequence renderer for multiple text MIME types. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/display/common/Image.java | Adds image renderers (png/jpeg/gif) with base64 encoding. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/comm/CommTarget.java | Adds comm target factory interface. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/comm/CommFactory.java | Adds comm factory interface with open-message customization. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/kernel/comm/Comm.java | Adds base comm abstraction with send/close hooks. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/StdinChannel.java | Adds stdin channel implementation using ROUTER socket. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/ShellReplyEnvironment.java | Adds shell reply env with stdin and shutdown flagging. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/ShellHandler.java | Adds handler interface for shell channel message dispatch. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/ShellChannel.java | Adds shell/control channel implementation with polling loop. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/ReplyEnvironment.java | Adds reply/publish abstraction with deferrals and status helpers. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/Loop.java | Adds loop thread abstraction with error/close callbacks. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/JupyterOutputStream.java | Adds output stream that publishes stdout/stderr messages. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/JupyterConnection.java | Adds ZMQ channel wiring and handler registration. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/IOPubChannel.java | Adds iopub channel binding implementation. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/HeartbeatChannel.java | Adds heartbeat REP channel with polling loop. |
| basekernel/src/main/java/io/github/spencerpark/jupyter/channels/DefaultReplyEnvironment.java | Adds default reply environment implementation with LIFO deferrals. |
| basekernel/README.md | Documents vendored basekernel version/revision and adaptations. |
| basekernel/LICENSE | Adds MIT license for vendored basekernel. |
| basekernel/build.gradle | Adds Gradle build for vendored basekernel module (JDK 25 toolchain). |
| .gitignore | Ignores generated notebook artifacts and additional local/dev outputs. |
Review details
Suppressed comments (2)
src/main/java/io/github/spencerpark/ijava/magics/JavaPlantUMLMagics.java:90
- plantUMLFile also assumes args is non-null (args.size()/isEmpty/get(0)). If invoked with null args, it will throw a NullPointerException before it can default the format.
src/test/java/io/github/spencerpark/ijava/magics/ShellMagicsTest.java:43 - This test also hard-codes /bin/sh; skip it when /bin/sh is not present to keep the test suite portable.
- Files reviewed: 202/208 changed files
- Comments generated: 8
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| private static String renderHTML(String tag, String srcAttr, java.net.URL url, Map<String, String> attrs) { | ||
| String encodedUrl; | ||
| try { | ||
| encodedUrl = URLEncoder.encode(url.toExternalForm(), "UTF-8"); | ||
| } catch (UnsupportedEncodingException e) { | ||
| throw new RuntimeException(e); // Should never happen... | ||
| } | ||
|
|
||
| //TODO add some html rendering utilities for the url and html entity encoding | ||
| StringBuilder html = new StringBuilder("<"); | ||
| html.append(tag); | ||
| html.append(" ").append(srcAttr).append("=\"").append(encodedUrl).append('"'); | ||
| attrs.forEach((attr, val) -> { | ||
| if (val != null) | ||
| html.append(" ").append(attr).append("=\"").append(val).append("\""); | ||
| }); | ||
| return html.toString(); | ||
| } |
There was a problem hiding this comment.
Fixed in 857050d: HTML output is escaped, tag/attribute names are sanitized, default anchor uses href, anchors add target="_blank" unless overridden, and void elements self-close.
| @Override | ||
| public PublishStatus deserialize(JsonElement element, Type type, JsonDeserializationContext ctx) throws JsonParseException { | ||
| PublishStatus.State state = ctx.deserialize(element.getAsJsonObject().get("execution_result"), PublishStatus.State.class); | ||
| switch (state) { | ||
| case BUSY: return PublishStatus.BUSY; | ||
| case IDLE: return PublishStatus.IDLE; | ||
| case STARTING: return PublishStatus.STARTING; | ||
| default: return null; |
There was a problem hiding this comment.
Fixed in 857050d: adapter reads execution_state and safely returns null for missing/invalid/unknown values.
| boolean showSource = args.stream() | ||
| .anyMatch(a -> a.equalsIgnoreCase("showSource") || a.equalsIgnoreCase("show-source") | ||
| || a.equals("--show-source") || a.equals("-s") || a.equalsIgnoreCase("source")); | ||
| String fileFormat = args.stream().filter(a -> a.equalsIgnoreCase("SVG") || a.equalsIgnoreCase("PNG")) | ||
| .findFirst().orElse("SVG"); |
There was a problem hiding this comment.
Fixed in 857050d: args and body are null-safe in both plantUML and plantUMLFile.
| try { | ||
| final String simple = className + ".java"; | ||
| Optional<Path> found = Files.walk(Paths.get(".")).filter(Files::isRegularFile) | ||
| .filter(p -> p.getFileName().toString().equals(simple)).findFirst(); | ||
| if (found.isPresent()) | ||
| return found; | ||
| } catch (IOException ignored) { | ||
| } |
There was a problem hiding this comment.
Fixed in 857050d: fallback search is bounded to depth 5 and skips .git, .gradle, build, node_modules, target, and similar directories.
| int warmup = params.getOrDefault("warmup", 1); | ||
| int iterations = params.getOrDefault("iterations", 5); | ||
|
|
||
| List<Long> samples = new ArrayList<>(iterations); |
There was a problem hiding this comment.
Fixed in 857050d: warmup is clamped to >= 0 and iterations to >= 1.
| List<String> args = Arrays.asList("--shell=/bin/sh"); | ||
| magics.shell(args, "echo hello-test-123"); |
There was a problem hiding this comment.
Fixed in 857050d: shell tests are skipped when /bin/sh is not executable.
| /** | ||
| * Default per-statement timeout applied when no {@value #TIMEOUT_KEY} parameter is | ||
| * configured. Suits classroom use where a runaway statement should not hang the | ||
| * kernel indefinitely. Set {@code IJAVA_TIMEOUT=-1} to disable the timeout. | ||
| */ | ||
| public static final long DEFAULT_TIMEOUT = 60; | ||
| public static final TimeUnit DEFAULT_TIMEOUT_UNIT = TimeUnit.SECONDS; |
There was a problem hiding this comment.
Fixed in 857050d: Javadoc matches behavior; IJava.java reads IJAVA_TIMEOUT and CodeEvaluatorBuilder passes it as the timeout parameter.
- harden URL display HTML escaping - parse publish status execution_state safely - bound PathResolver fallback search - guard PlantUML null inputs - clamp TimeIt parameters - skip shell tests when /bin/sh is unavailable
Summary
Prepares v1.4.6 for manual testing without creating a tag or publishing a release.
Validation
Validated locally with:
Result: Hello from IJava was printed and 42 was evaluated.
Release status
No release tag has been created and no release has been published.