From 1ead810da6d1a1b071c951af4fd5895633f93da1 Mon Sep 17 00:00:00 2001 From: Oliver Nybroe Date: Wed, 31 May 2023 11:45:13 +0200 Subject: [PATCH] feat: Add create Pest dialog support --- CHANGELOG.md | 3 + gradle.properties | 2 +- .../pest/templates/PestConfigNewFileAction.kt | 96 +++++++++++++++++++ src/main/resources/META-INF/plugin.xml | 11 ++- .../fileTemplates/internal/Pest It.php.ft | 6 ++ .../internal/Pest Scoped Dataset.php.ft | 6 ++ .../internal/Pest Shared Dataset.php.ft | 6 ++ .../fileTemplates/internal/Pest Test.php.ft | 6 ++ 8 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/pestphp/pest/templates/PestConfigNewFileAction.kt create mode 100644 src/main/resources/fileTemplates/internal/Pest It.php.ft create mode 100644 src/main/resources/fileTemplates/internal/Pest Scoped Dataset.php.ft create mode 100644 src/main/resources/fileTemplates/internal/Pest Shared Dataset.php.ft create mode 100644 src/main/resources/fileTemplates/internal/Pest Test.php.ft diff --git a/CHANGELOG.md b/CHANGELOG.md index caf7b573..2fb5e23c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ ## Unreleased +### Added +- Added pest file creation support + ## 1.9.3 - 2023-05-31 ### Fixed diff --git a/gradle.properties b/gradle.properties index 08446997..e91ad0d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ pluginGroup = com.pestphp pluginName = PEST PHP -pluginVersion = 1.9.3 +pluginVersion = 1.10.0-EAP.1 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions. diff --git a/src/main/kotlin/com/pestphp/pest/templates/PestConfigNewFileAction.kt b/src/main/kotlin/com/pestphp/pest/templates/PestConfigNewFileAction.kt new file mode 100644 index 00000000..21f872dc --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/templates/PestConfigNewFileAction.kt @@ -0,0 +1,96 @@ +package com.pestphp.pest.templates + +import com.intellij.ide.actions.CreateFileFromTemplateAction +import com.intellij.ide.actions.CreateFileFromTemplateDialog +import com.intellij.ide.fileTemplates.FileTemplate +import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiDirectory +import com.intellij.psi.PsiFile +import com.pestphp.pest.PestIcons + + +class PestConfigNewFileAction : + CreateFileFromTemplateAction() { + + override fun isAvailable(dataContext: DataContext): Boolean { + val view = LangDataKeys.IDE_VIEW.getData(dataContext) + var psiDir: PsiDirectory? = null + if (view != null) { + val directories = view.directories + if (directories.size == 1) { + psiDir = directories[0] + } + } + + if (psiDir == null || !psiDir.isValid) { + return false + } + + val virtualDir = psiDir.virtualFile + if (!virtualDir.isValid || !virtualDir.isDirectory) { + return false + } + + return virtualDir.path.contains("tests") + } + + override fun buildDialog(project: Project, directory: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) { + builder + .setTitle("Create Pest Test File") + .addKind("It", PestIcons.FILE, "Pest It") + .addKind("Test", PestIcons.FILE, "Pest Test") + .addKind("Shared dataset", PestIcons.DATASET_FILE, "Pest Shared Dataset") + .addKind("Scoped dataset", PestIcons.DATASET_FILE, "Pest Scoped Dataset") + } + + override fun getActionName(directory: PsiDirectory?, newName: String, templateName: String?): String { + return "Pest Test" + } + + override fun createFileFromTemplate(name: String?, template: FileTemplate, dir: PsiDirectory): PsiFile { + if (template.name == "Pest Shared Dataset") { + // find parent directory named "tests" + var parentDir = dir + while (parentDir.name != "tests") { + parentDir = parentDir.parentDirectory ?: break + } + + val datasetDir = parentDir.findSubdirectory("Datasets") + ?: parentDir.createSubdirectory("Datasets") + + // Check if first character is lowercase in name + var newName = name + if (name!![0].isLowerCase()) { + newName = name.replaceFirstChar { it.uppercase() } + } + + return createFileFromTemplate( + newName, + template, + datasetDir, + defaultTemplateProperty, + true, + mapOf("DATASET_NAME" to name.replaceFirstChar { it.lowercase() }) + )!! + } + + if (template.name == "Pest Scoped Dataset") { + return createFileFromTemplate( + "Datasets", + template, + dir, + defaultTemplateProperty, + true, + mapOf("DATASET_NAME" to name!!.replaceFirstChar { it.lowercase() }) + )!! + } + + var testName = name + if (!name!!.endsWith("test", true)) { + testName = "${name}Test" + } + + return super.createFileFromTemplate(testName, template, dir) + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index a7690b18..bccf4a91 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -115,6 +115,10 @@ description="Whether custom expectation file generation should happen." key="pestphp.custom-expectations" /> + + + + @@ -134,6 +138,11 @@ - + + + \ No newline at end of file diff --git a/src/main/resources/fileTemplates/internal/Pest It.php.ft b/src/main/resources/fileTemplates/internal/Pest It.php.ft new file mode 100644 index 00000000..57266d0a --- /dev/null +++ b/src/main/resources/fileTemplates/internal/Pest It.php.ft @@ -0,0 +1,6 @@ +