From 603f6296824209f8e9c7c05be27f763aee8db6b1 Mon Sep 17 00:00:00 2001 From: Neil Kulkarni Date: Mon, 27 Jan 2025 22:29:47 -0800 Subject: [PATCH 1/3] chore(amazonq): Update autobuild setting strings --- .../controller/FeatureDevController.kt | 2 +- .../settings/CodeWhispererConfigurable.kt | 52 +++++++++++-------- .../settings/CodeWhispererSettings.kt | 8 +-- .../resources/MessagesBundle.properties | 3 +- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt index d13f03e7fce..fa027cbb729 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt @@ -727,7 +727,7 @@ class FeatureDevController( return } - val codeWhispererSettings = CodeWhispererSettings.getInstance().getAutoBuildFeatureConfiguration() + val codeWhispererSettings = CodeWhispererSettings.getInstance().getAutoBuildSetting() val hasDevFile = session.context.checkForDevFile() val isPromptedForAutoBuildFeature = codeWhispererSettings.containsKey(session.context.getWorkspaceRoot()) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt index 2c02c5319f3..f26ffcea918 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt @@ -125,29 +125,6 @@ class CodeWhispererConfigurable(private val project: Project) : } } - group(message("aws.settings.codewhisperer.allow_q_dev_build_test_commands")) { - row { - val settings = codeWhispererSettings.getAutoBuildFeatureConfiguration() - for ((key) in settings) { - checkBox(key).apply { - connect.subscribe( - ToolkitConnectionManagerListener.TOPIC, - object : ToolkitConnectionManagerListener { - override fun activeConnectionChanged(newConnection: ToolkitConnection?) { - enabled(isCodeWhispererEnabled(project)) - } - } - ) - - bindSelected( - getter = { codeWhispererSettings.isAutoBuildFeatureEnabled(key) }, - setter = { newValue -> codeWhispererSettings.toggleAutoBuildFeature(key, newValue) } - ) - } - } - } - } - group(message("aws.settings.codewhisperer.group.q_chat")) { row { checkBox(message("aws.settings.codewhisperer.project_context")).apply { @@ -214,6 +191,35 @@ class CodeWhispererConfigurable(private val project: Project) : } } + val autoBuildSetting = codeWhispererSettings.getAutoBuildSetting() + if (autoBuildSetting.isNotEmpty()) { + group(message("aws.settings.codewhisperer.feature_development")) { + row { + text(message("aws.settings.codewhisperer.feature_development.allow_running_code_and_test_commands")) + } + row { + val settings = codeWhispererSettings.getAutoBuildSetting() + for ((key) in settings) { + checkBox(key).apply { + connect.subscribe( + ToolkitConnectionManagerListener.TOPIC, + object : ToolkitConnectionManagerListener { + override fun activeConnectionChanged(newConnection: ToolkitConnection?) { + enabled(isCodeWhispererEnabled(project)) + } + } + ) + + bindSelected( + getter = { codeWhispererSettings.isAutoBuildFeatureEnabled(key) }, + setter = { newValue -> codeWhispererSettings.toggleAutoBuildFeature(key, newValue) } + ) + } + } + } + } + } + group(message("aws.settings.codewhisperer.code_review")) { row { ExpandableTextField(ParametersListUtil.COLON_LINE_PARSER, ParametersListUtil.COLON_LINE_JOINER).also { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index a07a6261010..8dd3b867458 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -25,15 +25,15 @@ class CodeWhispererSettings : PersistentStateComponent() - val projectAutoBuildConfigurationMap by map() + val autoBuildSetting by map() } enum class CodeWhispererConfigurationType { diff --git a/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties b/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties index d41be10f419..5a08058621b 100644 --- a/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties +++ b/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties @@ -266,7 +266,8 @@ aws.settings.auto_update.notification_enable.tooltip=If unchecked, updates will aws.settings.auto_update.progress.message=Updating AWS plugins aws.settings.auto_update.text=Automatically install plugin updates when available aws.settings.aws_cli_settings=AWS CLI Settings -aws.settings.codewhisperer.allow_q_dev_build_test_commands=Amazon Q: Allow Q /dev to run code and test commands +aws.settings.codewhisperer.feature_development=Feature Development +aws.settings.codewhisperer.feature_development.allow_running_code_and_test_commands=Allow /dev to run code and test commands aws.settings.codewhisperer.automatic_import_adder=Imports recommendation aws.settings.codewhisperer.automatic_import_adder.tooltip=Amazon Q will add import statements with code suggestions when necessary aws.settings.codewhisperer.code_review=Code Review From 583bccb5b6ebb792d5c77cba64b851ea1a9b2cf4 Mon Sep 17 00:00:00 2001 From: Neil Kulkarni Date: Tue, 28 Jan 2025 09:21:41 -0800 Subject: [PATCH 2/3] fix: Add @get:Property on autoBuildSetting field of CodeWhispererSettings --- .../aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index 8dd3b867458..8f2f239580b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -153,6 +153,7 @@ class CodeWhispererConfiguration : BaseState() { @get:Property val stringValue by map() + @get:Property val autoBuildSetting by map() } From 2ed8be01494bdbd94296e036ac0c8f35fe1a5e17 Mon Sep 17 00:00:00 2001 From: Neil Kulkarni Date: Tue, 28 Jan 2025 10:25:06 -0800 Subject: [PATCH 3/3] test: Add tests to validate backwards compatibility of CodeWhispererSettings --- .../CodeWhispererConfigurableTest.kt | 1 + .../CodeWhispererSettingsTest.kt | 67 +++++++++++++++++++ .../settings/CodeWhispererSettings.kt | 3 + 3 files changed, 71 insertions(+) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt index 1436f2423f5..d65d042061a 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt @@ -13,6 +13,7 @@ import org.mockito.kotlin.doNothing import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanManager import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable +import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import software.aws.toolkits.resources.message import javax.swing.JCheckBox import javax.swing.JComponent diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSettingsTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSettingsTest.kt index 3a640c15bce..63bc70ae2b8 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSettingsTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSettingsTest.kt @@ -12,7 +12,9 @@ import com.intellij.openapi.wm.ToolWindowManager import com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager import com.intellij.testFramework.replaceService import com.intellij.testFramework.runInEdtAndWait +import com.intellij.util.xmlb.XmlSerializer import org.assertj.core.api.Assertions.assertThat +import org.jdom.output.XMLOutputter import org.junit.Before import org.junit.Ignore import org.junit.Test @@ -30,6 +32,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.status.CodeWhisper import software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceToolWindowFactory import software.aws.toolkits.jetbrains.settings.CodeWhispererConfiguration import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings +import software.aws.toolkits.jetbrains.utils.xmlElement import kotlin.test.fail class CodeWhispererSettingsTest : CodeWhispererTestBase() { @@ -145,6 +148,70 @@ class CodeWhispererSettingsTest : CodeWhispererTestBase() { assertThat(settingsManager.isIncludeCodeWithReference()).isEqualTo(true) } } + + @Test + fun `serialize settings to ensure backwards compatibility`() { + val element = xmlElement( + """ + + + """.trimIndent() + ) + + val settings = CodeWhispererSettings.getInstance() + settings.toggleAutoBuildFeature("project1", true) + + XmlSerializer.serializeInto(settings.state, element) + + val actual = XMLOutputter().outputString(element) + val expected = "\n" + + "" + + "" + + "" + + assertThat(actual).isEqualTo(expected) + } + + @Test + fun `deserialize empty settings to ensure backwards compatibility`() { + val element = xmlElement( + """ + + + """ + ) + val actual = XmlSerializer.deserialize(element, CodeWhispererConfiguration::class.java) + assertThat(actual.autoBuildSetting).hasSize(0) + } + + @Test + fun `deserialize existing settings to ensure backwards compatibility`() { + val element = xmlElement( + """ + + + + + """.trimIndent() + ) + val actual = XmlSerializer.deserialize(element, CodeWhispererConfiguration::class.java) + assertThat(actual.autoBuildSetting).hasSize(1) + assertThat(actual.autoBuildSetting["project1"]).isTrue() + } } class CodeWhispererSettingUnitTest { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index 8f2f239580b..48410b65949 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -131,15 +131,18 @@ class CodeWhispererSettings : PersistentStateComponent