diff --git a/CHANGELOG.md b/CHANGELOG.md index af03d2c8a9d..2b804c9bce3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# _3.101_ (2025-12-16) +- **Feature** AWS SDK v2 2.26.25 -> 2.40.8 +- **Feature** SAM path auto-detection works now also for homebrew installations +- **Feature** Support for Python 3.13 +- **Feature** Support for Python 3.14 + # _3.100_ (2025-12-09) # _3.99_ (2025-11-21) diff --git a/gradle.properties b/gradle.properties index b00a995420f..5518f5ca64e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ toolkitVersion=3.101-SNAPSHOT publishToken= publishChannel= -ideProfileName=2025.2 +ideProfileName=2025.3 remoteRobotPort=8080 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2a32f799b5..038d7e6e15e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ apache-commons-io = "2.16.1" apache-commons-text = "1.12.0" assertJ = "3.26.3" # match with /settings.gradle.kts -awsSdk = "2.26.25" +awsSdk = "2.40.8" commonmark = "0.22.0" detekt = "1.23.8" diff-util = "4.12" diff --git a/plugins/core/core/src/migration/software/aws/toolkits/core/ToolkitClientManager.kt b/plugins/core/core/src/migration/software/aws/toolkits/core/ToolkitClientManager.kt index 0f722e82905..e985ef4c93d 100644 --- a/plugins/core/core/src/migration/software/aws/toolkits/core/ToolkitClientManager.kt +++ b/plugins/core/core/src/migration/software/aws/toolkits/core/ToolkitClientManager.kt @@ -172,6 +172,10 @@ abstract class ToolkitClientManager { } val clientOverrideConfig = ClientOverrideConfiguration.builder() + clientOverrideConfig.putAdvancedOption( + SdkAdvancedClientOption.USER_AGENT_SUFFIX, + userAgent() + ) if (credProvider != null) { credentialsProvider(credProvider) @@ -194,49 +198,6 @@ abstract class ToolkitClientManager { } } - clientOverrideConfig.addExecutionInterceptor(object : ExecutionInterceptor { - override fun modifyRequest( - context: Context.ModifyRequest, - executionAttributes: ExecutionAttributes, - ): SdkRequest { - val request = context.request() - if (request !is AwsRequest) { - return request - } - - val clientType = executionAttributes.getAttribute(AwsExecutionAttribute.CLIENT_TYPE) - val sdkClient = executionAttributes.getAttribute(SdkInternalExecutionAttribute.SDK_CLIENT) - val serviceClientConfiguration = sdkClient.serviceClientConfiguration() - val retryMode = serviceClientConfiguration.overrideConfiguration().retryMode().orElse(RetryMode.defaultRetryMode()) - val toolkitUserAgent = userAgent() - - val requestUserAgent = ApplyUserAgentStage.resolveClientUserAgent( - toolkitUserAgent, - null, - clientType, - null, - null, - retryMode.toString().lowercase() - ) - - val overrideConfiguration = request.overrideConfiguration() - .map { config -> - config.toBuilder() - .putHeader(HEADER_USER_AGENT, requestUserAgent) - .build() - } - .orElseGet { - AwsRequestOverrideConfiguration.builder() - .putHeader(HEADER_USER_AGENT, requestUserAgent) - .build() - } - - return request.toBuilder() - .overrideConfiguration(overrideConfiguration) - .build() - } - }) - clientOverrideConfig.let { configuration -> configuration.retryStrategy(RetryMode.STANDARD) } diff --git a/plugins/core/core/src/software/aws/toolkits/core/lambda/LambdaRuntime.kt b/plugins/core/core/src/software/aws/toolkits/core/lambda/LambdaRuntime.kt index 66da37f6bd0..adcd54f20f0 100644 --- a/plugins/core/core/src/software/aws/toolkits/core/lambda/LambdaRuntime.kt +++ b/plugins/core/core/src/software/aws/toolkits/core/lambda/LambdaRuntime.kt @@ -31,6 +31,8 @@ enum class LambdaRuntime( PYTHON3_10(Runtime.PYTHON3_10, minSamDebugging = "1.78.0", minSamInit = "1.78.0", architectures = ARM_COMPATIBLE), PYTHON3_11(Runtime.PYTHON3_11, minSamDebugging = "1.87.0", minSamInit = "1.87.0", architectures = ARM_COMPATIBLE), PYTHON3_12(Runtime.PYTHON3_12, minSamDebugging = "1.103.0", minSamInit = "1.103.0", architectures = ARM_COMPATIBLE), + PYTHON3_13(Runtime.PYTHON3_13, minSamDebugging = "1.129.0", minSamInit = "1.129.0", architectures = ARM_COMPATIBLE), + PYTHON3_14(Runtime.PYTHON3_14, minSamDebugging = "1.150.1", minSamInit = "1.150.1", architectures = ARM_COMPATIBLE), DOTNET6_0(Runtime.DOTNET6, minSamDebugging = "1.40.1", minSamInit = "1.40.1", architectures = ARM_COMPATIBLE), ; diff --git a/plugins/toolkit/jetbrains-core/it/software/aws/toolkits/jetbrains/services/lambda/python/PythonLocalLambdaRunConfigurationIntegrationTest.kt b/plugins/toolkit/jetbrains-core/it/software/aws/toolkits/jetbrains/services/lambda/python/PythonLocalLambdaRunConfigurationIntegrationTest.kt index 6800d5ce31b..e537f0b553f 100644 --- a/plugins/toolkit/jetbrains-core/it/software/aws/toolkits/jetbrains/services/lambda/python/PythonLocalLambdaRunConfigurationIntegrationTest.kt +++ b/plugins/toolkit/jetbrains-core/it/software/aws/toolkits/jetbrains/services/lambda/python/PythonLocalLambdaRunConfigurationIntegrationTest.kt @@ -48,6 +48,8 @@ class PythonLocalLambdaRunConfigurationIntegrationTest(private val runtime: Runt arrayOf(Runtime.PYTHON3_10), arrayOf(Runtime.PYTHON3_11), arrayOf(Runtime.PYTHON3_12), + arrayOf(Runtime.PYTHON3_13), + arrayOf(Runtime.PYTHON3_14), ) } diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonDebugSupport.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonDebugSupport.kt index 4547655f6a2..4fad624508a 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonDebugSupport.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonDebugSupport.kt @@ -106,6 +106,20 @@ class Python312ImageDebugSupport : PythonImageDebugSupport() { override val bootstrapPath: String = "/var/runtime/bootstrap.py" } +class Python313ImageDebugSupport : PythonImageDebugSupport() { + override val id: String = LambdaRuntime.PYTHON3_13.toString() + override fun displayName() = LambdaRuntime.PYTHON3_13.toString().capitalize() + override val pythonPath: String = "/var/lang/bin/python3.13" + override val bootstrapPath: String = "/var/runtime/bootstrap.py" +} + +class Python314ImageDebugSupport : PythonImageDebugSupport() { + override val id: String = LambdaRuntime.PYTHON3_14.toString() + override fun displayName() = LambdaRuntime.PYTHON3_14.toString().capitalize() + override val pythonPath: String = "/var/lang/bin/python3.14" + override val bootstrapPath: String = "/var/runtime/bootstrap.py" +} + private const val DEBUGGER_VOLUME_PATH = "/tmp/lambci_debug_files" private fun createDebugProcess( diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroup.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroup.kt index 4cd17e72e7c..2e8148d25e3 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroup.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroup.kt @@ -25,12 +25,16 @@ class PythonRuntimeGroup : SdkBasedRuntimeGroup() { LambdaRuntime.PYTHON3_9, LambdaRuntime.PYTHON3_10, LambdaRuntime.PYTHON3_11, - LambdaRuntime.PYTHON3_12 + LambdaRuntime.PYTHON3_12, + LambdaRuntime.PYTHON3_13, + LambdaRuntime.PYTHON3_14 ) override fun runtimeForSdk(sdk: Sdk): LambdaRuntime? = when { !PythonSdkUtil.isPythonSdk(sdk) -> null + PythonSdkType.getLanguageLevelForSdk(sdk).isAtLeast(LanguageLevel.PYTHON314) -> LambdaRuntime.PYTHON3_14 + PythonSdkType.getLanguageLevelForSdk(sdk).isAtLeast(LanguageLevel.PYTHON313) -> LambdaRuntime.PYTHON3_13 PythonSdkType.getLanguageLevelForSdk(sdk).isAtLeast(LanguageLevel.PYTHON312) -> LambdaRuntime.PYTHON3_12 PythonSdkType.getLanguageLevelForSdk(sdk).isAtLeast(LanguageLevel.PYTHON311) -> LambdaRuntime.PYTHON3_11 PythonSdkType.getLanguageLevelForSdk(sdk).isAtLeast(LanguageLevel.PYTHON310) -> LambdaRuntime.PYTHON3_10 diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonSamProjectWizard.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonSamProjectWizard.kt index c22e155b868..0e868c8c773 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonSamProjectWizard.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/python/PythonSamProjectWizard.kt @@ -23,9 +23,11 @@ import software.aws.toolkits.jetbrains.services.lambda.wizard.TemplateParameters import software.aws.toolkits.resources.message private val pythonTemplateRuntimes = - setOf(LambdaRuntime.PYTHON3_8, LambdaRuntime.PYTHON3_9, LambdaRuntime.PYTHON3_10, LambdaRuntime.PYTHON3_11, LambdaRuntime.PYTHON3_12) + setOf(LambdaRuntime.PYTHON3_8, LambdaRuntime.PYTHON3_9, LambdaRuntime.PYTHON3_10, LambdaRuntime.PYTHON3_11, LambdaRuntime.PYTHON3_12, + LambdaRuntime.PYTHON3_13, LambdaRuntime.PYTHON3_14) private val eventBridgeTemplateRuntimes = - setOf(LambdaRuntime.PYTHON3_8, LambdaRuntime.PYTHON3_9, LambdaRuntime.PYTHON3_10, LambdaRuntime.PYTHON3_11, LambdaRuntime.PYTHON3_12) + setOf(LambdaRuntime.PYTHON3_8, LambdaRuntime.PYTHON3_9, LambdaRuntime.PYTHON3_10, LambdaRuntime.PYTHON3_11, LambdaRuntime.PYTHON3_12, + LambdaRuntime.PYTHON3_13, LambdaRuntime.PYTHON3_14) class PythonSamProjectWizard : SamProjectWizard { override fun createSdkSelectionPanel(projectLocation: TextFieldWithBrowseButton?): SdkSelector = when { diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/sam/SamExecutable.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/sam/SamExecutable.kt index a71da43cf4c..2cd80d4a8de 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/sam/SamExecutable.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/sam/SamExecutable.kt @@ -67,11 +67,16 @@ class SamExecutable : ExecutableType, AutoResolvable, Validatable { arrayOf("C:\\Program Files\\Amazon\\AWSSAMCLI\\bin", "C:\\Program Files (x86)\\Amazon\\AWSSAMCLI\\bin"), arrayOf("sam.cmd", "sam.exe") ) - } else { + } else if (SystemInfo.isMac) { ExecutableDetector().find( - arrayOf("/usr/local/bin", "/usr/bin"), + arrayOf("/usr/local/bin", "/usr/bin", "/opt/homebrew/bin/sam"), arrayOf("sam") ) + } else { + ExecutableDetector().find( + arrayOf("/usr/local/bin", "/usr/bin"), + arrayOf("sam") + ) } ) ?: return null diff --git a/plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroupTest.kt b/plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroupTest.kt index 56b4e5e8b57..1fcab78e1bc 100644 --- a/plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroupTest.kt +++ b/plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/lambda/python/PythonRuntimeGroupTest.kt @@ -52,9 +52,24 @@ class PythonRuntimeGroupTest { @Test fun testRuntimeDetection312() { val module = projectRule.module - // PythonCodeInsightTestFixtureRule already sets SDK to 3.12 - // projectRule.setModuleSdk(module, PyTestSdk.create("3.12.0")) + projectRule.setModuleSdk(module, PyTestSdk.create("3.12.0")) assertThat(sut.determineRuntime(module)).isEqualTo(LambdaRuntime.PYTHON3_12) } + + @Test + fun testRuntimeDetection313() { + val module = projectRule.module + projectRule.setModuleSdk(module, PyTestSdk.create("3.13.0")) + + assertThat(sut.determineRuntime(module)).isEqualTo(LambdaRuntime.PYTHON3_13) + } + + @Test + fun testRuntimeDetection314() { + val module = projectRule.module + projectRule.setModuleSdk(module, PyTestSdk.create("3.14.0")) + + assertThat(sut.determineRuntime(module)).isEqualTo(LambdaRuntime.PYTHON3_14) + } } diff --git a/plugins/toolkit/jetbrains-rider/ReSharper.AWS/src/AWS.Psi/Protocol/ModelZoneMarket.cs b/plugins/toolkit/jetbrains-rider/ReSharper.AWS/src/AWS.Psi/Protocol/ModelZoneMarket.cs deleted file mode 100644 index 6c3a4493fb9..00000000000 --- a/plugins/toolkit/jetbrains-rider/ReSharper.AWS/src/AWS.Psi/Protocol/ModelZoneMarket.cs +++ /dev/null @@ -1,16 +0,0 @@ -using JetBrains.Application.BuildScript.Application.Zones; -using JetBrains.Rider.Model; - -// https://github.com/JetBrains/resharper-unity/blob/cfd107d555a0a13a4b37273340bf930621d0a3dd/resharper/resharper-unity/src/Unity.Rider/ModelZoneMarker.cs - -// ReSharper disable once CheckNamespace -namespace AWS.Toolkit.Rider.Model -{ - // Zone marker for the generated models. Required to keep zone inspections happy because the generated code uses a - // type from a namespace that requires IRiderModelZone. In practice, this doesn't cause issues - // TODO: Look at moving the models to a better location or namespace? - [ZoneMarker] - public class ZoneMarker : IRequire - { - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 3c13798d46c..11169271721 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -68,7 +68,7 @@ buildscript { // match with version catalog, s3-build-cache has silent classpath conflict with codegen task // also since this is a settings plugin, we can't use a version catalog dependencies { - classpath(platform("software.amazon.awssdk:bom:2.26.25")) + classpath(platform("software.amazon.awssdk:bom:2.40.8")) } }