-
Notifications
You must be signed in to change notification settings - Fork 620
feat: add support for marimo notebooks #3930
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
📝 WalkthroughWalkthroughAdds Marimo notebook support: new MarimoNotebook executor class, language detection updated to recognize Changes
Sequence DiagramsequenceDiagram
participant Engine as Snakemake Engine
participant Detector as Script Detector
participant Executor as MarimoNotebook Executor
participant MarimoCLI as Marimo CLI / Python Runtime
participant FS as Filesystem
Engine->>Detector: inspect script filename / metadata
Detector-->>Engine: return "marimo_py"
Engine->>Executor: instantiate MarimoNotebook / prepare preamble & temp file
Executor->>FS: write_script(preamble, fd) (inject Marimo-compatible preamble)
Executor->>MarimoCLI: run `marimo edit` or `python` (export/run)
MarimoCLI-->>FS: produce flat `.py` logs / exported script
MarimoCLI-->>Executor: process exit / exported path
Executor-->>Engine: execution result / outputs
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🤖 Fix all issues with AI agents
In `@src/snakemake/notebook.py`:
- Around line 287-288: The ValueError raised when exec_class is None uses an
outdated message; update the exception message in the block that checks
exec_class (the raise in notebook.py near exec_class None) to mention both
supported notebook types (e.g., "Expecting Jupyter (.ipynb) or Marimo notebook")
or a more generic "Unsupported notebook format" so it reflects Marimo support.
- Around line 264-278: In execute_script (method execute_script in the notebook
class) change the command selection to respect the edit parameter: when edit is
None (headless) call marimo run --headless (instead of marimo edit) and when
edit is truthy keep marimo edit; ensure the export step still runs when
fname_out is present (use marimo run --headless {fname} && marimo export script
... or marimo edit ... && marimo export script ... as appropriate). Also add the
missing keyword is_python_script=True to both _execute_cmd calls so they match
PythonScript.execute_script and JupyterNotebook.execute_script signatures;
retain the existing path normalization logic for fname and fname_out and pass
those normalized values into the chosen commands.
In `@src/snakemake/script/__init__.py`:
- Around line 1682-1686: The duplicate condition filename.endswith(".py")
incorrectly marks all .py files as "marimo_py"; update the inner condition to
check for the Marimo suffix (e.g., filename.endswith(".marimo.py")) so that when
filename.endswith(".py") you further test filename.endswith(".marimo.py") to set
language = "marimo_py" only for Marimo notebooks and otherwise set language =
"python"; locate the logic that assigns the language variable (uses the filename
and language symbols) and replace the inner check accordingly.
🧹 Nitpick comments (1)
src/snakemake/notebook.py (1)
246-262: The regex for indenting the preamble is fragile and may produce incorrect results.The regex
r'(?:#)\n|(?:\n)#'with replacement'\n 'seems intended to add indentation, but:
- It removes
#characters in the process, which could corrupt comment delimiters in the preamble- The preamble from
PythonScript.generate_preambleis minified onto a single line (via_minify_preamble), so there won't be newlines to matchConsider using Python's
textwrap.indentfor cleaner indentation handling, or adjusting the preamble generation to work better with Marimo's cell structure.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
docs/snakefiles/rules.rstsrc/snakemake/notebook.pysrc/snakemake/script/__init__.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py
⚙️ CodeRabbit configuration file
**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of theselfargument of methods.
Do not suggest type annotation of theclsargument of classmethods.
Do not suggest return type annotation if a function or method does not contain areturnstatement.
Files:
src/snakemake/script/__init__.pysrc/snakemake/notebook.py
🧠 Learnings (4)
📓 Common learnings
Learnt from: zmbc
Repo: snakemake/snakemake PR: 2857
File: snakemake/notebook.py:84-90
Timestamp: 2024-10-29T17:14:13.585Z
Learning: In `snakemake/notebook.py`, when suggesting enhancements to the `execute_script` method in the `JupyterNotebook` class, ensure that changes align with both papermill and nbconvert use cases.
📚 Learning: 2024-10-29T17:14:13.585Z
Learnt from: zmbc
Repo: snakemake/snakemake PR: 2857
File: snakemake/notebook.py:84-90
Timestamp: 2024-10-29T17:14:13.585Z
Learning: In `snakemake/notebook.py`, when suggesting enhancements to the `execute_script` method in the `JupyterNotebook` class, ensure that changes align with both papermill and nbconvert use cases.
Applied to files:
docs/snakefiles/rules.rstsrc/snakemake/script/__init__.pysrc/snakemake/notebook.py
📚 Learning: 2024-10-06T14:09:54.370Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3117
File: tests/test_wrapper/Snakefile:11-11
Timestamp: 2024-10-06T14:09:54.370Z
Learning: Changes made within test cases, such as in `tests/test_wrapper/Snakefile`, are for testing purposes and do not require updates to the project documentation.
Applied to files:
docs/snakefiles/rules.rstsrc/snakemake/script/__init__.py
📚 Learning: 2026-01-08T11:13:20.523Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3643
File: src/snakemake/sourcecache.py:474-492
Timestamp: 2026-01-08T11:13:20.523Z
Learning: In Python files under src/snakemake, ensure that the per-run cache_path for source files does not change within a single workflow run, so that HostingProviderFile._hosted_repos can be keyed reliably by repository name. This invariant should be documented and enforced (e.g., by freezing cache_path after initialization, avoiding mutations during a run, and ensuring any caching uses a run-scoped key). This pattern applies to all modules in the Snakemake source cache area where per-run caching and repository hosting are implemented.
Applied to files:
src/snakemake/script/__init__.pysrc/snakemake/notebook.py
🧬 Code graph analysis (1)
src/snakemake/notebook.py (3)
src/snakemake/common/__init__.py (2)
is_local_file(193-194)write(487-488)src/snakemake/script/__init__.py (22)
script(1720-1802)PythonScript(693-897)ScriptBase(573-690)get_source(1649-1673)write_script(671-671)write_script(824-826)write_script(1019-1021)write_script(1107-1121)write_script(1194-1196)write_script(1408-1410)write_script(1601-1603)write_script(1626-1628)execute_script(674-674)execute_script(865-897)execute_script(1023-1034)execute_script(1123-1134)execute_script(1198-1199)execute_script(1412-1420)execute_script(1613-1614)execute_script(1618-1622)execute_script(1630-1631)_execute_cmd(676-690)src/snakemake/sourcecache.py (1)
abspath(195-196)
🪛 Ruff (0.14.11)
src/snakemake/notebook.py
264-264: Unused method argument: edit
(ARG002)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (37)
- GitHub Check: tests (9, ubuntu-latest, py312)
- GitHub Check: tests (7, ubuntu-latest, py312)
- GitHub Check: tests (9, macos-latest, py313)
- GitHub Check: tests (5, windows-2022, py313)
- GitHub Check: tests (9, windows-2022, py313)
- GitHub Check: tests (9, ubuntu-latest, py313)
- GitHub Check: tests (6, macos-latest, py313)
- GitHub Check: tests (10, macos-latest, py313)
- GitHub Check: tests (8, windows-2022, py313)
- GitHub Check: tests (10, windows-2022, py313)
- GitHub Check: tests (8, ubuntu-latest, py312)
- GitHub Check: tests (7, ubuntu-latest, py313)
- GitHub Check: tests (3, macos-latest, py313)
- GitHub Check: tests (7, windows-2022, py313)
- GitHub Check: tests (6, ubuntu-latest, py313)
- GitHub Check: tests (8, ubuntu-latest, py313)
- GitHub Check: tests (6, windows-2022, py313)
- GitHub Check: tests (4, ubuntu-latest, py313)
- GitHub Check: tests (10, ubuntu-latest, py312)
- GitHub Check: tests (10, ubuntu-latest, py313)
- GitHub Check: tests (5, ubuntu-latest, py312)
- GitHub Check: tests (6, ubuntu-latest, py312)
- GitHub Check: tests (5, ubuntu-latest, py313)
- GitHub Check: tests (4, windows-2022, py313)
- GitHub Check: tests (5, ubuntu-latest, py311)
- GitHub Check: tests (3, ubuntu-latest, py312)
- GitHub Check: tests (4, ubuntu-latest, py312)
- GitHub Check: tests (2, ubuntu-latest, py312)
- GitHub Check: tests (3, ubuntu-latest, py313)
- GitHub Check: tests (1, ubuntu-latest, py312)
- GitHub Check: tests (1, windows-2022, py313)
- GitHub Check: tests (3, windows-2022, py313)
- GitHub Check: tests (1, ubuntu-latest, py313)
- GitHub Check: tests (2, windows-2022, py313)
- GitHub Check: tests (2, macos-latest, py313)
- GitHub Check: tests (2, ubuntu-latest, py313)
- GitHub Check: apidocs
🔇 Additional comments (2)
src/snakemake/script/__init__.py (1)
1709-1713: LGTM!The simplified exception handling is appropriate since the exception variable wasn't being used.
docs/snakefiles/rules.rst (1)
1838-1871: LGTM!The documentation updates clearly explain Marimo notebook support, including the
.marimo.pyfile extension requirement and the note about logs being stored as flat Python scripts.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
src/snakemake/notebook.py
Outdated
| def execute_script(self, fname, edit=None): | ||
| if fname_out := self.log.get("notebook", None): | ||
| fname_out = os.path.abspath(fname_out) | ||
|
|
||
| if ON_WINDOWS: | ||
| fname = fname.replace("\\", "/") | ||
| fname_out = fname_out.replace("\\", "/") if fname_out else fname_out | ||
|
|
||
| self._execute_cmd( | ||
| "marimo edit {fname:q} && marimo export script {fname:q} -o {fname_out:q}", | ||
| fname=fname, | ||
| fname_out=fname_out, | ||
| ) | ||
| else: | ||
| self._execute_cmd("marimo edit {fname:q}", fname=fname) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# First, let's examine the actual code at the specified lines
cat -n src/snakemake/notebook.py | sed -n '264,278p'Repository: snakemake/snakemake
Length of output: 770
🏁 Script executed:
# Let's see the full MarimoNotebook class to understand the context
cat -n src/snakemake/notebook.py | sed -n '243,290p'Repository: snakemake/snakemake
Length of output: 2008
🏁 Script executed:
# Let's check the JupyterNotebook.execute_script for comparison
rg -A 20 "class JupyterNotebook" src/snakemake/notebook.pyRepository: snakemake/snakemake
Length of output: 707
🏁 Script executed:
# Search for any marimo references in the codebase
rg "marimo" src/snakemake/Repository: snakemake/snakemake
Length of output: 405
🌐 Web query:
marimo CLI commands headless execution marimo run
💡 Result:
You can run marimo non‑interactively (headless) with the CLI. Key points:
- Start an app without opening a browser: marimo run notebook.py --headless. [1]
- Useful flags: --port, --host, --watch, --include-code, --token/--no-token, --token-password-file, --sandbox, --trusted/untrusted. [1]
- To pass arguments to the notebook (available via sys.argv), put them after --, e.g. marimo run notebook.py -- --lr 1e-4 --epochs 10. Use mo.cli_args() or argparse inside the notebook. [2]
- For editing headless (no browser) use marimo edit --headless with similar server options. [1]
Sources: marimo CLI reference and running-as-app docs. [1][2]
References
[1] marimo CLI commands (marimo docs).
[2] Command line arguments / mo.cli_args() (marimo docs).
🏁 Script executed:
# Find JupyterNotebook.execute_script implementation
rg -A 30 "class JupyterNotebook" src/snakemake/notebook.py | grep -A 30 "def execute_script"Repository: snakemake/snakemake
Length of output: 45
🏁 Script executed:
# Find PythonScript.execute_script implementation
rg -A 30 "class PythonScript" src/snakemake/script/__init__.py | grep -A 30 "def execute_script"Repository: snakemake/snakemake
Length of output: 45
🏁 Script executed:
# Check the _execute_cmd method signature to understand is_python_script parameter
rg -B 5 "def _execute_cmd" src/snakemake/script/__init__.pyRepository: snakemake/snakemake
Length of output: 242
🏁 Script executed:
# Search for all execute_script definitions in notebook.py
rg "def execute_script" -A 15 src/snakemake/notebook.pyRepository: snakemake/snakemake
Length of output: 1234
🏁 Script executed:
# Search for is_python_script usage in the codebase
rg "is_python_script" src/snakemake/Repository: snakemake/snakemake
Length of output: 476
🏁 Script executed:
# Look at the full _execute_cmd method
rg -A 40 "def _execute_cmd" src/snakemake/script/__init__.py | head -60Repository: snakemake/snakemake
Length of output: 1100
🏁 Script executed:
# Get the full JupyterNotebook.execute_script implementation
rg -A 60 "class JupyterNotebook" src/snakemake/notebook.py | grep -A 60 "def execute_script"Repository: snakemake/snakemake
Length of output: 1148
🏁 Script executed:
# Check what parameters are passed when edit is not None
rg "edit\." src/snakemake/notebook.py | head -20Repository: snakemake/snakemake
Length of output: 336
🏁 Script executed:
# Look for where execute_script is called to understand the edit parameter
rg "execute_script\(" src/snakemake/ -B 2 -A 2Repository: snakemake/snakemake
Length of output: 3922
🏁 Script executed:
# Get the complete JupyterNotebook.execute_script to see the full logic
cat -n src/snakemake/notebook.py | sed -n '87,160p'Repository: snakemake/snakemake
Length of output: 3441
🏁 Script executed:
# Check PythonScript.execute_script to see is_python_script usage
cat -n src/snakemake/script/__init__.py | sed -n '350,380p'Repository: snakemake/snakemake
Length of output: 1410
🏁 Script executed:
# Find PythonScript.execute_script
rg -A 5 "class PythonScript" src/snakemake/script/__init__.py | grep -A 5 "def execute_script"Repository: snakemake/snakemake
Length of output: 45
🏁 Script executed:
# Get the complete PythonScript.execute_script
cat -n src/snakemake/script/__init__.py | sed -n '250,270p'Repository: snakemake/snakemake
Length of output: 1219
🏁 Script executed:
# Search for PythonScript class definition
rg "^class PythonScript" src/snakemake/script/__init__.py -A 100 | head -120Repository: snakemake/snakemake
Length of output: 3411
🏁 Script executed:
# Search for the execute_script method in PythonScript
rg "class PythonScript" src/snakemake/script/__init__.py -nRepository: snakemake/snakemake
Length of output: 98
🏁 Script executed:
# Find all execute_script methods and their line numbers
rg "def execute_script" src/snakemake/script/__init__.py -nRepository: snakemake/snakemake
Length of output: 558
🏁 Script executed:
# Get PythonScript.execute_script at line 865
cat -n src/snakemake/script/__init__.py | sed -n '865,875p'Repository: snakemake/snakemake
Length of output: 681
🏁 Script executed:
# Let me also check around line 1023 to see which class that belongs to
cat -n src/snakemake/script/__init__.py | sed -n '1020,1030p'Repository: snakemake/snakemake
Length of output: 653
🏁 Script executed:
# Get complete PythonScript.execute_script
cat -n src/snakemake/script/__init__.py | sed -n '865,920p'Repository: snakemake/snakemake
Length of output: 2524
🏁 Script executed:
# Check what class is at line 1023
cat -n src/snakemake/script/__init__.py | sed -n '990,1025p'Repository: snakemake/snakemake
Length of output: 1386
marimo edit always opens an interactive editor, breaking headless execution.
The execute_script method always runs marimo edit regardless of the edit parameter, which opens an interactive editor and blocks execution. In headless mode (where edit is None), the command should use marimo run --headless to execute the notebook without user interaction.
Additionally, is_python_script=True is missing from the _execute_cmd calls. This parameter is present in both PythonScript.execute_script (line 896) and JupyterNotebook.execute_script (line 117).
🧰 Tools
🪛 Ruff (0.14.11)
264-264: Unused method argument: edit
(ARG002)
🤖 Prompt for AI Agents
In `@src/snakemake/notebook.py` around lines 264 - 278, In execute_script (method
execute_script in the notebook class) change the command selection to respect
the edit parameter: when edit is None (headless) call marimo run --headless
(instead of marimo edit) and when edit is truthy keep marimo edit; ensure the
export step still runs when fname_out is present (use marimo run --headless
{fname} && marimo export script ... or marimo edit ... && marimo export script
... as appropriate). Also add the missing keyword is_python_script=True to both
_execute_cmd calls so they match PythonScript.execute_script and
JupyterNotebook.execute_script signatures; retain the existing path
normalization logic for fname and fname_out and pass those normalized values
into the chosen commands.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@src/snakemake/notebook.py`:
- Around line 246-264: The write_script method may silently fail to inject the
preamble if self.source does not contain the marker if __name__ == "__main__":;
update write_script (referencing preamble, source_with_preamble, and
self.source) to verify the substitution occurred (e.g., check that
source_with_preamble != self.source or that the target pattern exists in
self.source) and raise a clear exception or assert with an explanatory message
when injection did not happen, so callers fail fast instead of proceeding with a
missing Snakemake context.
♻️ Duplicate comments (2)
src/snakemake/notebook.py (2)
266-280: Duplicate:execute_scriptignoresedit/headless and omitsis_python_script.This matches an existing review finding (headless execution should not invoke interactive
marimo edit, and_execute_cmdshould passis_python_script=True).marimo CLI documentation: flags for `marimo run --headless` and `marimo edit` (host/port/no-browser)
283-290: Duplicate: update unsupported-notebook error message to mention Marimo.The existing error text still references only Jupyter notebooks; this was already flagged.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/snakemake/notebook.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py
⚙️ CodeRabbit configuration file
**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of theselfargument of methods.
Do not suggest type annotation of theclsargument of classmethods.
Do not suggest return type annotation if a function or method does not contain areturnstatement.
Files:
src/snakemake/notebook.py
🧠 Learnings (3)
📓 Common learnings
Learnt from: zmbc
Repo: snakemake/snakemake PR: 2857
File: snakemake/notebook.py:84-90
Timestamp: 2024-10-29T17:14:13.585Z
Learning: In `snakemake/notebook.py`, when suggesting enhancements to the `execute_script` method in the `JupyterNotebook` class, ensure that changes align with both papermill and nbconvert use cases.
📚 Learning: 2024-10-29T17:14:13.585Z
Learnt from: zmbc
Repo: snakemake/snakemake PR: 2857
File: snakemake/notebook.py:84-90
Timestamp: 2024-10-29T17:14:13.585Z
Learning: In `snakemake/notebook.py`, when suggesting enhancements to the `execute_script` method in the `JupyterNotebook` class, ensure that changes align with both papermill and nbconvert use cases.
Applied to files:
src/snakemake/notebook.py
📚 Learning: 2026-01-08T11:13:20.523Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3643
File: src/snakemake/sourcecache.py:474-492
Timestamp: 2026-01-08T11:13:20.523Z
Learning: In Python files under src/snakemake, ensure that the per-run cache_path for source files does not change within a single workflow run, so that HostingProviderFile._hosted_repos can be keyed reliably by repository name. This invariant should be documented and enforced (e.g., by freezing cache_path after initialization, avoiding mutations during a run, and ensuring any caching uses a run-scoped key). This pattern applies to all modules in the Snakemake source cache area where per-run caching and repository hosting are implemented.
Applied to files:
src/snakemake/notebook.py
🧬 Code graph analysis (1)
src/snakemake/notebook.py (2)
src/snakemake/common/__init__.py (2)
is_local_file(193-194)write(487-488)src/snakemake/script/__init__.py (21)
script(1720-1802)PythonScript(693-897)ScriptBase(573-690)write_script(671-671)write_script(824-826)write_script(1019-1021)write_script(1107-1121)write_script(1194-1196)write_script(1408-1410)write_script(1601-1603)write_script(1626-1628)execute_script(674-674)execute_script(865-897)execute_script(1023-1034)execute_script(1123-1134)execute_script(1198-1199)execute_script(1412-1420)execute_script(1613-1614)execute_script(1618-1622)execute_script(1630-1631)_execute_cmd(676-690)
🪛 Ruff (0.14.11)
src/snakemake/notebook.py
266-266: Unused method argument: edit
(ARG002)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (46)
- GitHub Check: tests (6, ubuntu-latest, py311)
- GitHub Check: tests (7, ubuntu-latest, py312)
- GitHub Check: tests (8, windows-2022, py313)
- GitHub Check: tests (10, ubuntu-latest, py311)
- GitHub Check: tests (9, windows-2022, py313)
- GitHub Check: tests (10, ubuntu-latest, py312)
- GitHub Check: tests (8, ubuntu-latest, py312)
- GitHub Check: tests (8, ubuntu-latest, py311)
- GitHub Check: tests (7, macos-latest, py313)
- GitHub Check: tests (3, ubuntu-latest, py312)
- GitHub Check: tests (10, ubuntu-latest, py313)
- GitHub Check: tests (10, windows-2022, py313)
- GitHub Check: tests (8, ubuntu-latest, py313)
- GitHub Check: tests (6, windows-2022, py313)
- GitHub Check: tests (7, ubuntu-latest, py313)
- GitHub Check: tests (7, ubuntu-latest, py311)
- GitHub Check: tests (5, ubuntu-latest, py311)
- GitHub Check: tests (7, windows-2022, py313)
- GitHub Check: tests (4, ubuntu-latest, py312)
- GitHub Check: tests (9, ubuntu-latest, py311)
- GitHub Check: tests (5, ubuntu-latest, py312)
- GitHub Check: tests (8, macos-latest, py313)
- GitHub Check: tests (4, ubuntu-latest, py311)
- GitHub Check: tests (4, macos-latest, py313)
- GitHub Check: tests (6, ubuntu-latest, py313)
- GitHub Check: tests (9, ubuntu-latest, py312)
- GitHub Check: tests (5, ubuntu-latest, py313)
- GitHub Check: tests (3, windows-2022, py313)
- GitHub Check: tests (9, ubuntu-latest, py313)
- GitHub Check: tests (5, windows-2022, py313)
- GitHub Check: tests (4, windows-2022, py313)
- GitHub Check: tests (1, ubuntu-latest, py311)
- GitHub Check: tests (3, ubuntu-latest, py311)
- GitHub Check: tests (4, ubuntu-latest, py313)
- GitHub Check: tests (6, ubuntu-latest, py312)
- GitHub Check: tests (3, ubuntu-latest, py313)
- GitHub Check: tests (2, ubuntu-latest, py313)
- GitHub Check: tests (2, windows-2022, py313)
- GitHub Check: tests (2, ubuntu-latest, py312)
- GitHub Check: tests (2, ubuntu-latest, py311)
- GitHub Check: tests (1, ubuntu-latest, py313)
- GitHub Check: tests (2, macos-latest, py313)
- GitHub Check: tests (1, ubuntu-latest, py312)
- GitHub Check: tests (1, windows-2022, py313)
- GitHub Check: tests (1, macos-latest, py313)
- GitHub Check: apidocs
🔇 Additional comments (2)
src/snakemake/notebook.py (2)
2-12: Import updates look good.The added imports are appropriate for the Marimo notebook integration.
90-92: Papermill command refactor preserves placeholder behavior.No issues with the updated formatting logic.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
Add support for marimo notebooks.
QC
docs/) is updated to reflect the changes or this is not necessary (e.g. if the change does neither modify the language nor the behavior or functionalities of Snakemake).Summary by CodeRabbit
Documentation
New Features
Tests
Bug Fixes / Improvements
✏️ Tip: You can customize this high-level summary in your review settings.