Skip to content

Commit 1ead810

Browse files
author
Oliver Nybroe
committed
feat: Add create Pest dialog support
1 parent d7cebbb commit 1ead810

File tree

8 files changed

+134
-2
lines changed

8 files changed

+134
-2
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
## Unreleased
66

7+
### Added
8+
- Added pest file creation support
9+
710
## 1.9.3 - 2023-05-31
811

912
### Fixed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
pluginGroup = com.pestphp
55
pluginName = PEST PHP
6-
pluginVersion = 1.9.3
6+
pluginVersion = 1.10.0-EAP.1
77

88
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
99
# for insight into build numbers and IntelliJ Platform versions.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.pestphp.pest.templates
2+
3+
import com.intellij.ide.actions.CreateFileFromTemplateAction
4+
import com.intellij.ide.actions.CreateFileFromTemplateDialog
5+
import com.intellij.ide.fileTemplates.FileTemplate
6+
import com.intellij.openapi.actionSystem.*
7+
import com.intellij.openapi.project.Project
8+
import com.intellij.psi.PsiDirectory
9+
import com.intellij.psi.PsiFile
10+
import com.pestphp.pest.PestIcons
11+
12+
13+
class PestConfigNewFileAction :
14+
CreateFileFromTemplateAction() {
15+
16+
override fun isAvailable(dataContext: DataContext): Boolean {
17+
val view = LangDataKeys.IDE_VIEW.getData(dataContext)
18+
var psiDir: PsiDirectory? = null
19+
if (view != null) {
20+
val directories = view.directories
21+
if (directories.size == 1) {
22+
psiDir = directories[0]
23+
}
24+
}
25+
26+
if (psiDir == null || !psiDir.isValid) {
27+
return false
28+
}
29+
30+
val virtualDir = psiDir.virtualFile
31+
if (!virtualDir.isValid || !virtualDir.isDirectory) {
32+
return false
33+
}
34+
35+
return virtualDir.path.contains("tests")
36+
}
37+
38+
override fun buildDialog(project: Project, directory: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) {
39+
builder
40+
.setTitle("Create Pest Test File")
41+
.addKind("It", PestIcons.FILE, "Pest It")
42+
.addKind("Test", PestIcons.FILE, "Pest Test")
43+
.addKind("Shared dataset", PestIcons.DATASET_FILE, "Pest Shared Dataset")
44+
.addKind("Scoped dataset", PestIcons.DATASET_FILE, "Pest Scoped Dataset")
45+
}
46+
47+
override fun getActionName(directory: PsiDirectory?, newName: String, templateName: String?): String {
48+
return "Pest Test"
49+
}
50+
51+
override fun createFileFromTemplate(name: String?, template: FileTemplate, dir: PsiDirectory): PsiFile {
52+
if (template.name == "Pest Shared Dataset") {
53+
// find parent directory named "tests"
54+
var parentDir = dir
55+
while (parentDir.name != "tests") {
56+
parentDir = parentDir.parentDirectory ?: break
57+
}
58+
59+
val datasetDir = parentDir.findSubdirectory("Datasets")
60+
?: parentDir.createSubdirectory("Datasets")
61+
62+
// Check if first character is lowercase in name
63+
var newName = name
64+
if (name!![0].isLowerCase()) {
65+
newName = name.replaceFirstChar { it.uppercase() }
66+
}
67+
68+
return createFileFromTemplate(
69+
newName,
70+
template,
71+
datasetDir,
72+
defaultTemplateProperty,
73+
true,
74+
mapOf("DATASET_NAME" to name.replaceFirstChar { it.lowercase() })
75+
)!!
76+
}
77+
78+
if (template.name == "Pest Scoped Dataset") {
79+
return createFileFromTemplate(
80+
"Datasets",
81+
template,
82+
dir,
83+
defaultTemplateProperty,
84+
true,
85+
mapOf("DATASET_NAME" to name!!.replaceFirstChar { it.lowercase() })
86+
)!!
87+
}
88+
89+
var testName = name
90+
if (!name!!.endsWith("test", true)) {
91+
testName = "${name}Test"
92+
}
93+
94+
return super.createFileFromTemplate(testName, template, dir)
95+
}
96+
}

src/main/resources/META-INF/plugin.xml

+10-1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@
115115
description="Whether custom expectation file generation should happen."
116116
key="pestphp.custom-expectations"
117117
/>
118+
<internalFileTemplate name="Pest It"/>
119+
<internalFileTemplate name="Pest Test"/>
120+
<internalFileTemplate name="Pest Scoped Dataset"/>
121+
<internalFileTemplate name="Pest Shared Dataset"/>
118122
</extensions>
119123

120124
<projectListeners>
@@ -134,6 +138,11 @@
134138
</extensions>
135139

136140
<actions>
137-
<!-- Add your actions here -->
141+
<action id="Pest.New.File"
142+
class="com.pestphp.pest.templates.PestConfigNewFileAction"
143+
icon="/file.svg"
144+
text="Pest Test">
145+
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewFromTemplate"/>
146+
</action>
138147
</actions>
139148
</idea-plugin>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
#parse("PHP File Header.php")
3+
4+
it('#[[$END$]]#', function () {
5+
6+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
#parse("PHP File Header.php")
3+
4+
dataset('#[[$DATASET_NAME$]]#', [
5+
'#[[$END$]]#'
6+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
#parse("PHP File Header.php")
3+
4+
dataset('#[[$DATASET_NAME$]]#', [
5+
'#[[$END$]]#'
6+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
#parse("PHP File Header.php")
3+
4+
test('#[[$END$]]#', function () {
5+
6+
});

0 commit comments

Comments
 (0)