diff --git a/CHANGELOG.md b/CHANGELOG.md index dd3871d6..025cadb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## [Unreleased] +- Add disableOnSaveOutsideOfProject option [[#155](https://github.com/koxudaxi/ruff-pycharm-plugin/pull/155)] ## [0.0.12] - 2023-04-19 - Support ruff 0.0.260 [[#144](https://github.com/koxudaxi/ruff-pycharm-plugin/pull/144)] diff --git a/gradle.properties b/gradle.properties index 090af726..990f7298 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = com.koxudaxi.ruff pluginName = Ruff pluginRepositoryUrl = https://github.com/koxudaxi/ruff-pycharm-plugin # SemVer format -> https://semver.org -pluginVersion = 0.0.12 +pluginVersion = 0.0.13 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 222 diff --git a/src/com/koxudaxi/ruff/Ruff.kt b/src/com/koxudaxi/ruff/Ruff.kt index 0e078240..f37b5bf4 100644 --- a/src/com/koxudaxi/ruff/Ruff.kt +++ b/src/com/koxudaxi/ruff/Ruff.kt @@ -215,6 +215,9 @@ fun parseJsonResponse(response: String): List = try { listOf() } +fun VirtualFile.isInProjectDir(project: Project): Boolean = + project.basePath?.let { canonicalPath?.startsWith(it) } ?: false + fun getProjectRelativeFilePath(project: Project, virtualFile: VirtualFile): String? { val canonicalPath = virtualFile.canonicalPath ?: return null return project.basePath?.takeIf { canonicalPath.startsWith(it) }?.let { diff --git a/src/com/koxudaxi/ruff/RuffConfigPanel.form b/src/com/koxudaxi/ruff/RuffConfigPanel.form index 1a9ba5c2..0f2fa0bd 100644 --- a/src/com/koxudaxi/ruff/RuffConfigPanel.form +++ b/src/com/koxudaxi/ruff/RuffConfigPanel.form @@ -10,7 +10,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -41,7 +41,7 @@ - + @@ -49,13 +49,21 @@ - + + + + + + + + + diff --git a/src/com/koxudaxi/ruff/RuffConfigPanel.kt b/src/com/koxudaxi/ruff/RuffConfigPanel.kt index b46143ac..03981b52 100644 --- a/src/com/koxudaxi/ruff/RuffConfigPanel.kt +++ b/src/com/koxudaxi/ruff/RuffConfigPanel.kt @@ -26,6 +26,7 @@ class RuffConfigPanel(project: Project) { private lateinit var projectRuffExecutablePathField: JBTextField private lateinit var ruffConfigPathField: TextFieldWithBrowseButton private lateinit var clearRuffConfigPathButton: JButton + private lateinit var disableOnSaveOutsideOfProjectCheckBox: JCheckBox init { val ruffConfigService = getInstance(project) @@ -37,6 +38,11 @@ class RuffConfigPanel(project: Project) { showRuleCodeCheckBox.isEnabled = true alwaysUseGlobalRuffCheckBox.isEnabled = true alwaysUseGlobalRuffCheckBox.isSelected = ruffConfigService.alwaysUseGlobalRuff + disableOnSaveOutsideOfProjectCheckBox.isEnabled = ruffConfigService.runRuffOnSave + disableOnSaveOutsideOfProjectCheckBox.isSelected = ruffConfigService.disableOnSaveOutsideOfProject + runRuffOnSaveCheckBox.addActionListener { + disableOnSaveOutsideOfProjectCheckBox.isEnabled = runRuffOnSaveCheckBox.isSelected + } setProjectRuffExecutablePath(project) globalRuffExecutablePathField.apply { @@ -85,6 +91,8 @@ class RuffConfigPanel(project: Project) { get() = alwaysUseGlobalRuffCheckBox.isSelected val ruffConfigPath: @SystemDependent String? get() = ruffConfigPathField.text.takeIf { it.isNotBlank() } + val disableOnSaveOutsideOfProject: Boolean + get() = disableOnSaveOutsideOfProjectCheckBox.isSelected companion object { const val RUFF_EXECUTABLE_NOT_FOUND = "Ruff executable not found" } diff --git a/src/com/koxudaxi/ruff/RuffConfigService.kt b/src/com/koxudaxi/ruff/RuffConfigService.kt index 55258c2e..ca2b28e4 100644 --- a/src/com/koxudaxi/ruff/RuffConfigService.kt +++ b/src/com/koxudaxi/ruff/RuffConfigService.kt @@ -16,7 +16,7 @@ class RuffConfigService : PersistentStateComponent { var alwaysUseGlobalRuff: Boolean = false var projectRuffExecutablePath: @SystemDependent String? = null var ruffConfigPath: @SystemDependent String? = null - + var disableOnSaveOutsideOfProject: Boolean = true override fun getState(): RuffConfigService { return this diff --git a/src/com/koxudaxi/ruff/RuffConfigurable.kt b/src/com/koxudaxi/ruff/RuffConfigurable.kt index d8b23a20..1762908b 100644 --- a/src/com/koxudaxi/ruff/RuffConfigurable.kt +++ b/src/com/koxudaxi/ruff/RuffConfigurable.kt @@ -29,7 +29,8 @@ class RuffConfigurable internal constructor(project: Project) : Configurable { ruffConfigService.showRuleCode != configPanel.showRuleCode || ruffConfigService.alwaysUseGlobalRuff != configPanel.alwaysUseGlobalRuff || ruffConfigService.globalRuffExecutablePath != configPanel.globalRuffExecutablePath || - ruffConfigService.ruffConfigPath != configPanel.ruffConfigPath + ruffConfigService.ruffConfigPath != configPanel.ruffConfigPath || + ruffConfigService.disableOnSaveOutsideOfProject != configPanel.disableOnSaveOutsideOfProject } @@ -40,6 +41,7 @@ class RuffConfigurable internal constructor(project: Project) : Configurable { ruffConfigService.alwaysUseGlobalRuff = configPanel.alwaysUseGlobalRuff ruffConfigService.globalRuffExecutablePath = configPanel.globalRuffExecutablePath ruffConfigService.ruffConfigPath = configPanel.ruffConfigPath + ruffConfigService.disableOnSaveOutsideOfProject = configPanel.disableOnSaveOutsideOfProject } override fun disposeUIResources() { diff --git a/src/com/koxudaxi/ruff/RuffFileDocumentManagerListener.kt b/src/com/koxudaxi/ruff/RuffFileDocumentManagerListener.kt index 818dd069..9a18ff76 100644 --- a/src/com/koxudaxi/ruff/RuffFileDocumentManagerListener.kt +++ b/src/com/koxudaxi/ruff/RuffFileDocumentManagerListener.kt @@ -4,14 +4,16 @@ import com.intellij.openapi.editor.Document import com.intellij.openapi.fileEditor.FileDocumentManagerListener import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocumentManager +import com.intellij.testFramework.utils.editor.getVirtualFile -class RuffFileDocumentManagerListener(project: Project) : FileDocumentManagerListener { +class RuffFileDocumentManagerListener(val project: Project) : FileDocumentManagerListener { private val ruffConfigService = RuffConfigService.getInstance(project) private val ruffFixService by lazy { RuffFixService.getInstance(project)} private val psiDocumentManager by lazy { PsiDocumentManager.getInstance(project) } - override fun beforeDocumentSaving(document: Document) { + override fun beforeDocumentSaving(document: Document) { if (!ruffConfigService.runRuffOnSave) return val psiFile = psiDocumentManager.getPsiFile(document) ?: return + if (ruffConfigService.disableOnSaveOutsideOfProject && !psiFile.virtualFile.isInProjectDir(project)) return if (!psiFile.isApplicableTo) return ruffFixService.fix(document, psiFile) }