Skip to content
This repository was archived by the owner on May 8, 2024. It is now read-only.

Commit 290077a

Browse files
Merge pull request #69 from stack-spot/bugfix/performance
Bug Fix: Decreased the response time to select the Stackfile of the new project
2 parents 79d651c + 63615e9 commit 290077a

File tree

5 files changed

+115
-16
lines changed

5 files changed

+115
-16
lines changed

src/main/kotlin/com/stackspot/intellij/services/CreateProjectService.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,27 @@ import com.stackspot.intellij.services.enums.ProjectWizardState
2424
import com.stackspot.model.ImportedStacks
2525
import com.stackspot.model.Stack
2626
import com.stackspot.model.Stackfile
27+
import com.stackspot.model.StkVersion
28+
import kotlinx.coroutines.launch
29+
import kotlinx.coroutines.runBlocking
2730
import java.util.concurrent.Executors
2831
import java.util.concurrent.TimeUnit
2932

30-
private const val STK_VERSION_MESSAGE = "stk version"
31-
3233
@Service
3334
class CreateProjectService() {
3435

36+
init {
37+
runBlocking {
38+
launch { ImportedStacks.getInstance() }
39+
launch { StkVersion.getInstance() }
40+
}
41+
}
42+
3543
var stack: Stack? = null
3644
var stackfile: Stackfile? = null
3745
val state: ProjectWizardState
3846
get() {
39-
return if (!isInstalled()) {
47+
return if (!StkVersion.getInstance().isInstalled()) {
4048
ProjectWizardState.NOT_INSTALLED
4149
} else if (!ImportedStacks.getInstance().hasStackFiles()) {
4250
ProjectWizardState.STACKFILES_EMPTY
@@ -58,11 +66,6 @@ class CreateProjectService() {
5866
this.gitConfigCmd = gitConfigCmd
5967
}
6068

61-
private fun isInstalled(): Boolean {
62-
val stdout = version.runSync().stdout
63-
return stdout.contains(STK_VERSION_MESSAGE)
64-
}
65-
6669
fun isStackfileSelected(): Boolean = stack != null && stackfile != null
6770

6871
fun clearInfo() {

src/main/kotlin/com/stackspot/jackson/JacksonExtensions.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ inline fun <reified T> String.parseJsonToMapWithList(): HashMap<String, List<T>>
7676
return JacksonExtensions.objectMapperJson.readValue(content, typeRef)
7777
}
7878

79+
const val SQUARE_BRACKETS = "[]"
7980
inline fun <reified T> String.parseJsonToList(): List<T> {
80-
val content = if (this.contains(CURLY_BRACKETS)) "[]" else this
81+
val content = if (this.contains(SQUARE_BRACKETS)) SQUARE_BRACKETS else this
8182
val typeRef: TypeReference<List<T>> = object : TypeReference<List<T>>() {}
8283
return JacksonExtensions.objectMapperJson.readValue(content, typeRef)
8384
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright 2022 ZUP IT SERVICOS EM TECNOLOGIA E INOVACAO SA
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.stackspot.model
18+
19+
import com.stackspot.intellij.commands.stk.Version
20+
import kotlinx.coroutines.launch
21+
import kotlinx.coroutines.runBlocking
22+
23+
private const val STK_VERSION_MESSAGE = "stk version"
24+
25+
class StkVersion(private val version: Version) {
26+
27+
private lateinit var stkVersion: String
28+
29+
init {
30+
runBlocking {
31+
launch { stkVersion = version.runAsync().await().stdout }
32+
}
33+
}
34+
35+
companion object {
36+
@Volatile
37+
private lateinit var instance: StkVersion
38+
39+
fun getInstance(
40+
version: Version = Version(),
41+
newInstance: Boolean = false
42+
): StkVersion {
43+
synchronized(this) {
44+
if (!::instance.isInitialized || newInstance) {
45+
instance = StkVersion(version)
46+
}
47+
return instance
48+
}
49+
}
50+
}
51+
52+
fun isInstalled(): Boolean {
53+
return stkVersion.contains(STK_VERSION_MESSAGE)
54+
}
55+
}

src/test/kotlin/com/stackspot/intellij/services/CreateProjectServiceTest.kt

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.stackspot.intellij.services.enums.ProjectWizardState
2424
import com.stackspot.model.ImportedStacks
2525
import com.stackspot.model.Stack
2626
import com.stackspot.model.Stackfile
27+
import com.stackspot.model.StkVersion
2728
import io.kotest.assertions.asClue
2829
import io.kotest.matchers.shouldBe
2930
import io.mockk.*
@@ -41,7 +42,7 @@ import java.util.stream.Stream
4142
internal class CreateProjectServiceTest {
4243

4344
private val gitConfigCmd: GitConfig = mockk(relaxUnitFun = true)
44-
private val version: Version = mockk(relaxUnitFun = true)
45+
private val version: Version = mockk(relaxed = true)
4546
private val stackInfoList: CommandInfoList = mockk(relaxed = true)
4647
private val stackfileInfoList: CommandInfoList = mockk(relaxed = true)
4748
private val templateInfoList: CommandInfoList = mockk(relaxed = true)
@@ -52,6 +53,7 @@ internal class CreateProjectServiceTest {
5253
clearAllMocks()
5354
stubbing()
5455
ImportedStacks.getInstance(stackInfoList, stackfileInfoList, templateInfoList, pluginInfoList)
56+
mockkObject(StkVersion)
5557
mockkObject(ImportedStacks)
5658
}
5759

@@ -68,27 +70,42 @@ internal class CreateProjectServiceTest {
6870
@Test
6971
fun `service state should be STACKFILES_EMPTY`() {
7072
every { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() } returns false
71-
every { version.runSync().stdout } returns "stk version"
73+
coEvery { version.runAsync().await().stdout } returns "stk version"
74+
StkVersion.getInstance(version)
75+
every { StkVersion.getInstance(any()).isInstalled() } returns true
76+
7277
val service = CreateProjectService(version = version)
78+
7379
service.state shouldBe ProjectWizardState.STACKFILES_EMPTY
7480
verify { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() }
81+
verify { StkVersion.getInstance(any()).isInstalled() }
7582
confirmVerified(ImportedStacks)
83+
confirmVerified(StkVersion)
7684
}
7785

7886
@Test
7987
fun `service state should be NOT_INSTALLED`() {
80-
every { version.runSync().stdout } returns ""
88+
coEvery { version.runAsync().await().stdout } returns ""
89+
StkVersion.getInstance(version)
90+
every { StkVersion.getInstance(any()).isInstalled() } returns false
91+
8192
val service = CreateProjectService(version = version)
93+
8294
service.state shouldBe ProjectWizardState.NOT_INSTALLED
83-
verify { version.runSync() }
95+
verify { StkVersion.getInstance(any()).isInstalled() }
96+
confirmVerified(StkVersion)
8497
}
8598

8699
@Test
87100
fun `service state should be GIT_CONFIG_NOT_OK`() {
88101
every { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() } returns true
89-
every { version.runSync().stdout } returns "stk version"
102+
coEvery { version.runAsync().await().stdout } returns "stk version"
103+
StkVersion.getInstance(version)
104+
every { StkVersion.getInstance(any()).isInstalled() } returns true
90105
every { (gitConfigCmd.runner as BackgroundCommandRunner).stdout } returns ""
106+
91107
val service = CreateProjectService(gitConfigCmd = gitConfigCmd, version = version)
108+
92109
service.state shouldBe ProjectWizardState.GIT_CONFIG_NOT_OK
93110
verify { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() }
94111
verify { gitConfigCmd.run() }
@@ -102,6 +119,10 @@ internal class CreateProjectServiceTest {
102119
stackfile: Stackfile?,
103120
expected: Boolean
104121
) {
122+
coEvery { version.runAsync().await().stdout } returns "stk version"
123+
StkVersion.getInstance(version)
124+
every { StkVersion.getInstance(any()).isInstalled() } returns true
125+
105126
val service = CreateProjectService().saveInfo(stack, stackfile)
106127
Assertions.assertEquals(service.isStackfileSelected(), expected)
107128
}
@@ -131,9 +152,13 @@ internal class CreateProjectServiceTest {
131152
@Test
132153
fun `service state should be OK`() {
133154
every { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() } returns true
134-
every { version.runSync().stdout } returns "stk version"
155+
coEvery { version.runAsync().await().stdout } returns "stk version"
156+
StkVersion.getInstance(version)
157+
every { StkVersion.getInstance(any()).isInstalled() } returns true
135158
every { (gitConfigCmd.runner as BackgroundCommandRunner).stdout } returns "ok"
159+
136160
val service = CreateProjectService(gitConfigCmd = gitConfigCmd, version = version)
161+
137162
service.state shouldBe ProjectWizardState.OK
138163
verify { ImportedStacks.getInstance(any(), any(), any(), any()).hasStackFiles() }
139164
verify(exactly = 2) { gitConfigCmd.run() }
@@ -154,6 +179,10 @@ internal class CreateProjectServiceTest {
154179
@ParameterizedTest
155180
@MethodSource("saveInfoArgs")
156181
fun `should saveInfo when args aren't null`(stack: Stack?, stackfile: Stackfile?) {
182+
coEvery { version.runAsync().await().stdout } returns "stk version"
183+
StkVersion.getInstance(version)
184+
every { StkVersion.getInstance(any()).isInstalled() } returns true
185+
157186
val service = CreateProjectService().saveInfo(stack, stackfile)
158187
service.asClue {
159188
it.stack shouldBe stack
@@ -164,6 +193,7 @@ internal class CreateProjectServiceTest {
164193
@ParameterizedTest
165194
@MethodSource("saveInfoNullArgs")
166195
fun `should saveInfo when args are null`(stack: Stack?, stackfile: Stackfile?) {
196+
167197
val service = CreateProjectService().saveInfo(stack, stackfile)
168198
service.asClue {
169199
it.stack shouldBe stack
@@ -178,6 +208,10 @@ internal class CreateProjectServiceTest {
178208
stackfile: Stackfile?,
179209
expected: Boolean
180210
) {
211+
coEvery { version.runAsync().await().stdout } returns "stk version"
212+
StkVersion.getInstance(version)
213+
every { StkVersion.getInstance(any()).isInstalled() } returns true
214+
181215
val service = CreateProjectService().saveInfo(stack, stackfile)
182216
Assertions.assertEquals(service.isStackfileSelected(), expected)
183217
}

src/test/kotlin/com/stackspot/model/ImportedStacksTest.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,14 @@ class ImportedStacksTest {
104104
- stk cli successfully initialized!
105105
{}
106106
"""
107+
val stackStdout = """
108+
> Initializing stk cli...
109+
- stacks folder created!
110+
- stk cli successfully initialized!
111+
[]
112+
"""
107113

108-
coEvery { stackInfoList.runAsync().await().stdout } returns stdout
114+
coEvery { stackInfoList.runAsync().await().stdout } returns stackStdout
109115
coEvery { stackfileInfoList.runAsync().await().stdout } returns stdout
110116
coEvery { templateInfoList.runAsync().await().stdout } returns stdout
111117
coEvery { pluginInfoList.runAsync().await().stdout } returns stdout

0 commit comments

Comments
 (0)