Skip to content

chore: prepare v1.4.6 release on JDK 25 - #1

Open
emmanuelbruno wants to merge 49 commits into
masterfrom
chore/build-correctness
Open

emmanuelbruno wants to merge 49 commits into
masterfrom
chore/build-correctness

Conversation

@emmanuelbruno

Copy link
Copy Markdown
Collaborator

Summary

Prepares v1.4.6 for manual testing without creating a tag or publishing a release.

  • Vendors jupyter-jvm-basekernel as a local Gradle module
  • Upgrades the build to JDK 25 and Gradle 9.7.1
  • Hardens Shadow JAR packaging and kernel metadata
  • Fixes install.py to honor --replace and serialize the kernelspec path safely
  • Release workflow now runs clean build shadowJar packDist and smoke tests through install.py with kernel name java
  • Updates UPGRADE.md for 1.4.6

Validation

Validated locally with:

  • ./gradlew --no-daemon clean build shadowJar packDist
  • unzip build/distributions/IJava-1.4.6.zip
  • python3 -m venv venv
  • ./venv/bin/pip install jupyter-client nbconvert
  • ./venv/bin/python install.py --sys-prefix --replace
  • execute a minimal Java notebook with --ExecutePreprocessor.kernel_name=java

Result: Hello from IJava was printed and 42 was evaluated.

Release status

No release tag has been created and no release has been published.

- Use %%compile for all compilation examples
- Add Lombok example and Greeter demo
- Fix %%write usage and reorder notebook
- 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.
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.
Copilot AI lite review requested due to automatic review settings September 2, 2026 16:20

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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-basekernel into basekernel/ 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.

Comment thread docs/sample_java/com/example/Product.java Outdated
Comment on lines +46 to +63
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();
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +13 to +20
@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;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: adapter reads execution_state and safely returns null for missing/invalid/unknown values.

Comment on lines +41 to +45
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");

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: args and body are null-safe in both plantUML and plantUMLFile.

Comment on lines +38 to +45
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) {
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: fallback search is bounded to depth 5 and skips .git, .gradle, build, node_modules, target, and similar directories.

Comment on lines +55 to +58
int warmup = params.getOrDefault("warmup", 1);
int iterations = params.getOrDefault("iterations", 5);

List<Long> samples = new ArrayList<>(iterations);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: warmup is clamped to >= 0 and iterations to >= 1.

Comment on lines +31 to +32
List<String> args = Arrays.asList("--shell=/bin/sh");
magics.shell(args, "echo hello-test-123");

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: shell tests are skipped when /bin/sh is not executable.

Comment on lines +50 to +56
/**
* 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;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 857050d: Javadoc matches behavior; IJava.java reads IJAVA_TIMEOUT and CodeEvaluatorBuilder passes it as the timeout parameter.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants