[pycharm] PY-90736 Jupyter: add Marimo plugin promotion

(cherry picked from commit 399a22c7931f5983b1a719a7d66524b69e6bbb1b)

GitOrigin-RevId: 3760dcfccabb04e576836963561f2dbbbcec05d1
This commit is contained in:
Ekaterina.Itsenko
2026-08-05 11:33:49 +00:00
committed by intellij-monorepo-bot
parent 1e92a93c90
commit 910239dd08
3 changed files with 45 additions and 0 deletions
@@ -162,6 +162,7 @@
<pluginSuggestionProvider order="first" implementation="com.jetbrains.python.suggestions.PycharmProSuggestionProvider"/>
<pluginSuggestionProvider implementation="com.jetbrains.python.suggestions.PythonDapPluginSuggestionProvider"/>
<pluginSuggestionProvider implementation="com.jetbrains.python.suggestions.MarimoSuggestionProvider"/>
<postStartupActivity implementation="com.jetbrains.python.poetry.PoetryPyProjectTomlPostStartupActivity"/>
<postStartupActivity implementation="com.jetbrains.python.psi.resolve.PyPartialStubMarkersInvalidatorActivity"/>
<postStartupActivity implementation="com.jetbrains.python.debugger.PyDebuggerBackendToolWindowSetup"/>
@@ -1627,6 +1627,7 @@ advertiser.python.dap.plugin.enable.text=Enable Plugin
debugger.dap.plugin.install.got.it.header=Try the Python DAP Debugger plugin
debugger.dap.plugin.install.got.it.text=Install the Python DAP Debugger plugin for faster and more reliable Python debugging with debugpy
debugger.dap.plugin.enable.got.it.text=Enable the Python DAP Debugger plugin for faster and more reliable Python debugging with debugpy
advertiser.marimo.plugin.suggestion.text=Open and run marimo reactive notebooks by installing the marimo plugin.
action.PyInstallPackage.text=Install
action.PyInstallPackageAction.text=Advanced Package Install\u2026
@@ -0,0 +1,43 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.python.suggestions
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.FileIndexFacade
import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginSuggestion
import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginSuggestionProvider
import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.buildSuggestionIfNeeded
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiManager
import com.jetbrains.python.PyBundle
import com.jetbrains.python.PythonFileType
import com.jetbrains.python.psi.PyFile
import com.jetbrains.python.pyi.PyiFile
private const val MARIMO_PLUGIN_ID: String = "io.marimo.notebook"
private const val MARIMO_PLUGIN_NAME: String = "marimo"
private const val MARIMO_PLUGIN_SUGGESTION_DISMISSED_KEY: String = "marimo.plugin.suggestion.dismissed"
internal class MarimoSuggestionProvider : PluginSuggestionProvider {
override fun getSuggestion(project: Project, file: VirtualFile): PluginSuggestion? {
if (file.fileType != PythonFileType.INSTANCE || FileIndexFacade.getInstance(project).isInLibraryClasses(file)) {
return null
}
val psiFile = PsiManager.getInstance(project).findFile(file)
if (psiFile == null || psiFile is PyiFile || psiFile !is PyFile || !psiFile.importsMarimo()) return null
return buildSuggestionIfNeeded(
project,
pluginIds = listOf(MARIMO_PLUGIN_ID),
pluginName = MARIMO_PLUGIN_NAME,
suggestionText = PyBundle.message("advertiser.marimo.plugin.suggestion.text"),
suggestionDismissKey = MARIMO_PLUGIN_SUGGESTION_DISMISSED_KEY,
)
}
private fun PyFile.importsMarimo(): Boolean {
val imports = fromImports.mapNotNull { it.importSourceQName?.firstComponent } +
importTargets.mapNotNull { it.importedQName?.firstComponent }
return imports.contains("marimo")
}
}