From b4e701fc7b3f1094b1f360b30b3659a081dff6c0 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Wed, 7 Jan 2026 14:50:04 -0800 Subject: [PATCH 1/6] feat: add experimental uv support --- samcli/commands/_utils/experimental.py | 3 ++ samcli/lib/build/workflow_config.py | 42 +++++++++++++++---- samcli/lib/build/workflows.py | 10 +++++ schema/samcli.json | 15 +------ .../unit/commands/_utils/test_experimental.py | 8 ++-- .../lib/build_module/test_workflow_config.py | 29 +++++++++++++ 6 files changed, 83 insertions(+), 24 deletions(-) diff --git a/samcli/commands/_utils/experimental.py b/samcli/commands/_utils/experimental.py index 41e0f046fb..bb75dbd58e 100644 --- a/samcli/commands/_utils/experimental.py +++ b/samcli/commands/_utils/experimental.py @@ -55,6 +55,9 @@ class ExperimentalFlag: ) } RustCargoLambda = ExperimentalEntry("experimentalCargoLambda", EXPERIMENTAL_ENV_VAR_PREFIX + "RUST_CARGO_LAMBDA") + UvPackageManager = ExperimentalEntry( + "experimentalUvPackageManager", EXPERIMENTAL_ENV_VAR_PREFIX + "UV_PACKAGE_MANAGER" + ) def is_experimental_enabled(config_entry: ExperimentalEntry) -> bool: diff --git a/samcli/lib/build/workflow_config.py b/samcli/lib/build/workflow_config.py index 32f4601754..9ca1d973ae 100644 --- a/samcli/lib/build/workflow_config.py +++ b/samcli/lib/build/workflow_config.py @@ -6,6 +6,7 @@ import os from typing import Dict, List, Optional, Union, cast +from samcli.commands._utils.experimental import ExperimentalFlag, is_experimental_enabled from samcli.lib.build.workflows import ( CONFIG, DOTNET_CLIPACKAGE_CONFIG, @@ -17,6 +18,7 @@ NODEJS_NPM_ESBUILD_CONFIG, PROVIDED_MAKE_CONFIG, PYTHON_PIP_CONFIG, + PYTHON_UV_CONFIG, RUBY_BUNDLER_CONFIG, RUST_CARGO_LAMBDA_CONFIG, ) @@ -157,14 +159,26 @@ def get_workflow_config( "rust-cargolambda": BasicWorkflowSelector(RUST_CARGO_LAMBDA_CONFIG), } + use_uv = is_experimental_enabled(ExperimentalFlag.UvPackageManager) + selectors_by_runtime = { - "python3.8": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.9": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.10": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.11": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.12": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.13": BasicWorkflowSelector(PYTHON_PIP_CONFIG), - "python3.14": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.8": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.9": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.10": ConditionalWorkflowSelector( + default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv + ), + "python3.11": ConditionalWorkflowSelector( + default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv + ), + "python3.12": ConditionalWorkflowSelector( + default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv + ), + "python3.13": ConditionalWorkflowSelector( + default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv + ), + "python3.14": ConditionalWorkflowSelector( + default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv + ), "nodejs16.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs18.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs20.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), @@ -335,3 +349,17 @@ def get_config(self, code_dir: str, project_dir: str) -> CONFIG: @staticmethod def _has_manifest(config: CONFIG, directory: str) -> bool: return os.path.exists(os.path.join(directory, config.manifest_name)) + + +class ConditionalWorkflowSelector(BasicWorkflowSelector): + """ + Selects between two workflow configs based on a condition + """ + + def __init__(self, default: CONFIG, alternative: CONFIG, use_alternative: bool = False): + self.default = default + self.alternative = alternative + self.use_alternative = use_alternative + + def get_config(self, code_dir: str, project_dir: str) -> CONFIG: + return self.alternative if self.use_alternative else self.default diff --git a/samcli/lib/build/workflows.py b/samcli/lib/build/workflows.py index d97f83b99e..d92ccef007 100644 --- a/samcli/lib/build/workflows.py +++ b/samcli/lib/build/workflows.py @@ -24,6 +24,15 @@ must_mount_with_write_in_container=False, ) +PYTHON_UV_CONFIG = CONFIG( + language="python", + dependency_manager="uv", + application_framework=None, + manifest_name="pyproject.toml", + executable_search_paths=None, + must_mount_with_write_in_container=False, +) + NODEJS_NPM_CONFIG = CONFIG( language="nodejs", dependency_manager="npm", @@ -117,6 +126,7 @@ ALL_CONFIGS: List[CONFIG] = [ PYTHON_PIP_CONFIG, + PYTHON_UV_CONFIG, NODEJS_NPM_CONFIG, RUBY_BUNDLER_CONFIG, JAVA_GRADLE_CONFIG, diff --git a/schema/samcli.json b/schema/samcli.json index 84ae577f12..1da14b4df9 100644 --- a/schema/samcli.json +++ b/schema/samcli.json @@ -2202,11 +2202,12 @@ "title": "parameter_overrides", "type": [ "array", + "object", "string" ], "description": "String that contains AWS CloudFormation parameter overrides encoded as key=value pairs.", "items": { - "type": "string" + "$ref": "#/$defs/parameter_overrides_items" } }, "stack_name": { @@ -2271,18 +2272,6 @@ "description": "Available parameters for the list stack outputs command:\n* stack_name:\nName of corresponding deployed stack.\n* output:\nOutput the results from the command in a given output format (json or table).\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* save_params:\nSave the parameters provided via the command line to the configuration file.", "type": "object", "properties": { - "parameter_overrides": { - "title": "parameter_overrides", - "type": [ - "array", - "object", - "string" - ], - "description": "String that contains AWS CloudFormation parameter overrides encoded as key=value pairs.", - "items": { - "$ref": "#/$defs/parameter_overrides_items" - } - }, "stack_name": { "title": "stack_name", "type": "string", diff --git a/tests/unit/commands/_utils/test_experimental.py b/tests/unit/commands/_utils/test_experimental.py index a73760a280..217fd47bcf 100644 --- a/tests/unit/commands/_utils/test_experimental.py +++ b/tests/unit/commands/_utils/test_experimental.py @@ -57,16 +57,16 @@ def test_set_experimental(self): self.gc_mock.return_value.set_value.assert_called_once_with(config_entry, False, is_flag=True, flush=False) def test_get_all_experimental(self): - self.assertEqual(len(get_all_experimental()), 5) + self.assertEqual(len(get_all_experimental()), 6) def test_get_all_experimental_statues(self): - self.assertEqual(len(get_all_experimental_statues()), 5) + self.assertEqual(len(get_all_experimental_statues()), 6) def test_get_all_experimental_env_vars(self): - self.assertEqual(len(get_all_experimental_env_vars()), 5) + self.assertEqual(len(get_all_experimental_env_vars()), 6) def test_get_enabled_experimental_flags(self): - self.assertEqual(len(get_enabled_experimental_flags()), 5) + self.assertEqual(len(get_enabled_experimental_flags()), 6) @patch("samcli.commands._utils.experimental.set_experimental") @patch("samcli.commands._utils.experimental.get_all_experimental") diff --git a/tests/unit/lib/build_module/test_workflow_config.py b/tests/unit/lib/build_module/test_workflow_config.py index 29a0369920..775e98864f 100644 --- a/tests/unit/lib/build_module/test_workflow_config.py +++ b/tests/unit/lib/build_module/test_workflow_config.py @@ -6,7 +6,9 @@ get_workflow_config, UnsupportedRuntimeException, UnsupportedBuilderException, + ConditionalWorkflowSelector, ) +from samcli.lib.build.workflows import PYTHON_PIP_CONFIG, PYTHON_UV_CONFIG from samcli.lib.telemetry.event import Event, EventTracker @@ -178,3 +180,30 @@ def test_must_raise_for_unsupported_runtimes(self): get_workflow_config(runtime, self.code_dir, self.project_dir) self.assertEqual(str(ctx.exception), "'foobar' runtime is not supported") + + +class TestPythonUvWorkflowConfig(TestCase): + def setUp(self): + self.code_dir = "" + self.project_dir = "" + EventTracker.clear_trackers() + + @patch("samcli.lib.build.workflow_config.is_experimental_enabled") + def test_python_uses_pip_when_uv_experimental_disabled(self, mock_experimental): + mock_experimental.return_value = False + + result = get_workflow_config("python3.11", self.code_dir, self.project_dir) + + self.assertEqual(result.language, "python") + self.assertEqual(result.dependency_manager, "pip") + self.assertEqual(result.manifest_name, "requirements.txt") + + @patch("samcli.lib.build.workflow_config.is_experimental_enabled") + def test_python_uses_uv_when_experimental_enabled(self, mock_experimental): + mock_experimental.return_value = True + + result = get_workflow_config("python3.11", self.code_dir, self.project_dir) + + self.assertEqual(result.language, "python") + self.assertEqual(result.dependency_manager, "uv") + self.assertEqual(result.manifest_name, "pyproject.toml") From ef773534025175853a3df9952637a813d2c7edd1 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Wed, 7 Jan 2026 15:48:38 -0800 Subject: [PATCH 2/6] test: add uv build integration test --- .../buildcmd/test_build_cmd_python.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/integration/buildcmd/test_build_cmd_python.py b/tests/integration/buildcmd/test_build_cmd_python.py index 93128ea796..f376c99228 100644 --- a/tests/integration/buildcmd/test_build_cmd_python.py +++ b/tests/integration/buildcmd/test_build_cmd_python.py @@ -1,4 +1,5 @@ import logging +import os import pathlib from typing import Set from unittest import skipIf @@ -621,3 +622,22 @@ def test_unsupported_runtime(self): self.assertEqual(1, process_execute.process.returncode) self.assertIn("Build Failed", str(process_execute.stdout)) + + +class TestBuildCommand_PythonUv(BuildIntegBase): + def test_build_python_with_uv_experimental_flag(self): + # Set experimental flag + os.environ["SAM_CLI_BETA_UV_PACKAGE_MANAGER"] = "true" + + try: + overrides = {"Runtime": "python3.11", "CodeUri": "Python"} + cmdlist = self.get_command_list(parameter_overrides=overrides) + + command_result = run_command(cmdlist, cwd=self.working_dir) + + # Verify build succeeded + self.assertEqual(command_result.process.returncode, 0) + + finally: + # Clean up environment + os.environ.pop("SAM_CLI_BETA_UV_PACKAGE_MANAGER", None) From b7f8673b4ad69391b3edd4646b9100257c83b3df Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Fri, 9 Jan 2026 09:53:39 -0800 Subject: [PATCH 3/6] feat: make uv accessible by BuildMethod template parameter --- samcli/commands/build/build_context.py | 19 ++++++++++--------- samcli/lib/build/workflow_config.py | 23 ++++++----------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/samcli/commands/build/build_context.py b/samcli/commands/build/build_context.py index 4f133a7009..7f2096dd07 100644 --- a/samcli/commands/build/build_context.py +++ b/samcli/commands/build/build_context.py @@ -281,7 +281,8 @@ def run(self) -> None: ) self._check_exclude_warning() - self._check_rust_cargo_experimental_flag() + self._check_build_method_experimental_flag('rust-cargolambda') + self._check_build_method_experimental_flag('python-uv') for f in self.get_resources_to_build().functions: EventTracker.track_event(EventName.BUILD_FUNCTION_RUNTIME.value, f.runtime) @@ -696,24 +697,24 @@ def _check_exclude_warning(self) -> None: if self._resource_identifier in excludes: LOG.warning(self._EXCLUDE_WARNING_MESSAGE) - def _check_rust_cargo_experimental_flag(self) -> None: + def _check_build_method_experimental_flag(self, build_method: str) -> None: """ Prints warning message and confirms if user wants to use beta feature """ WARNING_MESSAGE = ( - 'Build method "rust-cargolambda" is a beta feature.\n' - "Please confirm if you would like to proceed\n" + f'Build method "{build_method}" is a beta feature.\n' + 'Please confirm if you would like to proceed\n' 'You can also enable this beta feature with "sam build --beta-features".' ) resources_to_build = self.get_resources_to_build() - is_building_rust = False + is_building_experimental = False for function in resources_to_build.functions: - if function.metadata and function.metadata.get("BuildMethod", "") == "rust-cargolambda": - is_building_rust = True + if function.metadata and function.metadata.get("BuildMethod", "") == build_method: + is_building_experimental = True break - if is_building_rust: - prompt_experimental(ExperimentalFlag.RustCargoLambda, WARNING_MESSAGE) + if is_building_experimental: + prompt_experimental(ExperimentalFlag.RustCargoLambda if build_method == "rust-cargolambda" else ExperimentalFlag.UvPackageManager, WARNING_MESSAGE) @property def build_in_source(self) -> Optional[bool]: diff --git a/samcli/lib/build/workflow_config.py b/samcli/lib/build/workflow_config.py index 9ca1d973ae..bb83300d73 100644 --- a/samcli/lib/build/workflow_config.py +++ b/samcli/lib/build/workflow_config.py @@ -157,28 +157,17 @@ def get_workflow_config( "dotnet7": BasicWorkflowSelector(DOTNET_CLIPACKAGE_CONFIG), "dotnet": BasicWorkflowSelector(DOTNET_CLIPACKAGE_CONFIG), "rust-cargolambda": BasicWorkflowSelector(RUST_CARGO_LAMBDA_CONFIG), + "python-uv": BasicWorkflowSelector(PYTHON_UV_CONFIG), } - use_uv = is_experimental_enabled(ExperimentalFlag.UvPackageManager) - selectors_by_runtime = { "python3.8": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), "python3.9": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.10": ConditionalWorkflowSelector( - default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv - ), - "python3.11": ConditionalWorkflowSelector( - default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv - ), - "python3.12": ConditionalWorkflowSelector( - default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv - ), - "python3.13": ConditionalWorkflowSelector( - default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv - ), - "python3.14": ConditionalWorkflowSelector( - default=PYTHON_PIP_CONFIG, alternative=PYTHON_UV_CONFIG, use_alternative=use_uv - ), + "python3.10": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.11": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.12": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.13": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.14": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), "nodejs16.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs18.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs20.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), From 496b9e808c9e41395990afea17a80ce2b1859152 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Fri, 9 Jan 2026 10:44:42 -0800 Subject: [PATCH 4/6] fix: clean up experimental flag method --- samcli/commands/build/build_context.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/samcli/commands/build/build_context.py b/samcli/commands/build/build_context.py index 7f2096dd07..fcb4a700c4 100644 --- a/samcli/commands/build/build_context.py +++ b/samcli/commands/build/build_context.py @@ -281,8 +281,7 @@ def run(self) -> None: ) self._check_exclude_warning() - self._check_build_method_experimental_flag('rust-cargolambda') - self._check_build_method_experimental_flag('python-uv') + self._check_build_method_experimental_flag() for f in self.get_resources_to_build().functions: EventTracker.track_event(EventName.BUILD_FUNCTION_RUNTIME.value, f.runtime) @@ -697,24 +696,23 @@ def _check_exclude_warning(self) -> None: if self._resource_identifier in excludes: LOG.warning(self._EXCLUDE_WARNING_MESSAGE) - def _check_build_method_experimental_flag(self, build_method: str) -> None: + def _check_build_method_experimental_flag(self) -> None: """ Prints warning message and confirms if user wants to use beta feature """ - WARNING_MESSAGE = ( - f'Build method "{build_method}" is a beta feature.\n' - 'Please confirm if you would like to proceed\n' - 'You can also enable this beta feature with "sam build --beta-features".' - ) + EXPERIMENTAL_BUILD_METHODS = { "rust-cargolambda": ExperimentalFlag.RustCargoLambda, "python-uv": ExperimentalFlag.UvPackageManager } + resources_to_build = self.get_resources_to_build() - is_building_experimental = False for function in resources_to_build.functions: - if function.metadata and function.metadata.get("BuildMethod", "") == build_method: - is_building_experimental = True - break + if function.metadata and function.metadata.get("BuildMethod", "") in EXPERIMENTAL_BUILD_METHODS: + build_method = function.metadata.get("BuildMethod", "") + WARNING_MESSAGE = ( + f'Build method "{build_method}" is a beta feature.\n' + 'Please confirm if you would like to proceed\n' + 'You can also enable this beta feature with "sam build --beta-features".' + ) - if is_building_experimental: - prompt_experimental(ExperimentalFlag.RustCargoLambda if build_method == "rust-cargolambda" else ExperimentalFlag.UvPackageManager, WARNING_MESSAGE) + prompt_experimental(EXPERIMENTAL_BUILD_METHODS[build_method], WARNING_MESSAGE) @property def build_in_source(self) -> Optional[bool]: From 0da43ccccfcda37c63ed8f165e4a37bfa19a2ae5 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Fri, 9 Jan 2026 10:52:05 -0800 Subject: [PATCH 5/6] chore misc formatting --- samcli/commands/build/build_context.py | 7 +++-- samcli/lib/build/workflow_config.py | 29 +++++-------------- .../buildcmd/test_build_cmd_python.py | 20 ------------- .../lib/build_module/test_workflow_config.py | 29 ------------------- 4 files changed, 12 insertions(+), 73 deletions(-) diff --git a/samcli/commands/build/build_context.py b/samcli/commands/build/build_context.py index fcb4a700c4..8ca8ebb133 100644 --- a/samcli/commands/build/build_context.py +++ b/samcli/commands/build/build_context.py @@ -700,7 +700,10 @@ def _check_build_method_experimental_flag(self) -> None: """ Prints warning message and confirms if user wants to use beta feature """ - EXPERIMENTAL_BUILD_METHODS = { "rust-cargolambda": ExperimentalFlag.RustCargoLambda, "python-uv": ExperimentalFlag.UvPackageManager } + EXPERIMENTAL_BUILD_METHODS = { + "rust-cargolambda": ExperimentalFlag.RustCargoLambda, + "python-uv": ExperimentalFlag.UvPackageManager, + } resources_to_build = self.get_resources_to_build() for function in resources_to_build.functions: @@ -708,7 +711,7 @@ def _check_build_method_experimental_flag(self) -> None: build_method = function.metadata.get("BuildMethod", "") WARNING_MESSAGE = ( f'Build method "{build_method}" is a beta feature.\n' - 'Please confirm if you would like to proceed\n' + "Please confirm if you would like to proceed\n" 'You can also enable this beta feature with "sam build --beta-features".' ) diff --git a/samcli/lib/build/workflow_config.py b/samcli/lib/build/workflow_config.py index bb83300d73..a44cba3ef4 100644 --- a/samcli/lib/build/workflow_config.py +++ b/samcli/lib/build/workflow_config.py @@ -6,7 +6,6 @@ import os from typing import Dict, List, Optional, Union, cast -from samcli.commands._utils.experimental import ExperimentalFlag, is_experimental_enabled from samcli.lib.build.workflows import ( CONFIG, DOTNET_CLIPACKAGE_CONFIG, @@ -161,13 +160,13 @@ def get_workflow_config( } selectors_by_runtime = { - "python3.8": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.9": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.10": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.11": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.12": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.13": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), - "python3.14": BasicWorkflowSelector([PYTHON_PIP_CONFIG]), + "python3.8": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.9": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.10": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.11": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.12": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.13": BasicWorkflowSelector(PYTHON_PIP_CONFIG), + "python3.14": BasicWorkflowSelector(PYTHON_PIP_CONFIG), "nodejs16.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs18.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), "nodejs20.x": BasicWorkflowSelector(NODEJS_NPM_CONFIG), @@ -338,17 +337,3 @@ def get_config(self, code_dir: str, project_dir: str) -> CONFIG: @staticmethod def _has_manifest(config: CONFIG, directory: str) -> bool: return os.path.exists(os.path.join(directory, config.manifest_name)) - - -class ConditionalWorkflowSelector(BasicWorkflowSelector): - """ - Selects between two workflow configs based on a condition - """ - - def __init__(self, default: CONFIG, alternative: CONFIG, use_alternative: bool = False): - self.default = default - self.alternative = alternative - self.use_alternative = use_alternative - - def get_config(self, code_dir: str, project_dir: str) -> CONFIG: - return self.alternative if self.use_alternative else self.default diff --git a/tests/integration/buildcmd/test_build_cmd_python.py b/tests/integration/buildcmd/test_build_cmd_python.py index f376c99228..93128ea796 100644 --- a/tests/integration/buildcmd/test_build_cmd_python.py +++ b/tests/integration/buildcmd/test_build_cmd_python.py @@ -1,5 +1,4 @@ import logging -import os import pathlib from typing import Set from unittest import skipIf @@ -622,22 +621,3 @@ def test_unsupported_runtime(self): self.assertEqual(1, process_execute.process.returncode) self.assertIn("Build Failed", str(process_execute.stdout)) - - -class TestBuildCommand_PythonUv(BuildIntegBase): - def test_build_python_with_uv_experimental_flag(self): - # Set experimental flag - os.environ["SAM_CLI_BETA_UV_PACKAGE_MANAGER"] = "true" - - try: - overrides = {"Runtime": "python3.11", "CodeUri": "Python"} - cmdlist = self.get_command_list(parameter_overrides=overrides) - - command_result = run_command(cmdlist, cwd=self.working_dir) - - # Verify build succeeded - self.assertEqual(command_result.process.returncode, 0) - - finally: - # Clean up environment - os.environ.pop("SAM_CLI_BETA_UV_PACKAGE_MANAGER", None) diff --git a/tests/unit/lib/build_module/test_workflow_config.py b/tests/unit/lib/build_module/test_workflow_config.py index 775e98864f..29a0369920 100644 --- a/tests/unit/lib/build_module/test_workflow_config.py +++ b/tests/unit/lib/build_module/test_workflow_config.py @@ -6,9 +6,7 @@ get_workflow_config, UnsupportedRuntimeException, UnsupportedBuilderException, - ConditionalWorkflowSelector, ) -from samcli.lib.build.workflows import PYTHON_PIP_CONFIG, PYTHON_UV_CONFIG from samcli.lib.telemetry.event import Event, EventTracker @@ -180,30 +178,3 @@ def test_must_raise_for_unsupported_runtimes(self): get_workflow_config(runtime, self.code_dir, self.project_dir) self.assertEqual(str(ctx.exception), "'foobar' runtime is not supported") - - -class TestPythonUvWorkflowConfig(TestCase): - def setUp(self): - self.code_dir = "" - self.project_dir = "" - EventTracker.clear_trackers() - - @patch("samcli.lib.build.workflow_config.is_experimental_enabled") - def test_python_uses_pip_when_uv_experimental_disabled(self, mock_experimental): - mock_experimental.return_value = False - - result = get_workflow_config("python3.11", self.code_dir, self.project_dir) - - self.assertEqual(result.language, "python") - self.assertEqual(result.dependency_manager, "pip") - self.assertEqual(result.manifest_name, "requirements.txt") - - @patch("samcli.lib.build.workflow_config.is_experimental_enabled") - def test_python_uses_uv_when_experimental_enabled(self, mock_experimental): - mock_experimental.return_value = True - - result = get_workflow_config("python3.11", self.code_dir, self.project_dir) - - self.assertEqual(result.language, "python") - self.assertEqual(result.dependency_manager, "uv") - self.assertEqual(result.manifest_name, "pyproject.toml") From dc1cfb583daafc97a9596f0bb272c1431dfa4360 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Fri, 9 Jan 2026 11:00:19 -0800 Subject: [PATCH 6/6] nit: remove reference to refactored method --- tests/unit/commands/buildcmd/test_build_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/commands/buildcmd/test_build_context.py b/tests/unit/commands/buildcmd/test_build_context.py index 261d654b32..aacd787d70 100644 --- a/tests/unit/commands/buildcmd/test_build_context.py +++ b/tests/unit/commands/buildcmd/test_build_context.py @@ -1254,7 +1254,7 @@ def test_must_catch_function_not_found_exception( @patch("samcli.commands.build.build_context.BuildContext._is_sam_template") @patch("samcli.commands.build.build_context.BuildContext.get_resources_to_build") @patch("samcli.commands.build.build_context.BuildContext._check_exclude_warning") - @patch("samcli.commands.build.build_context.BuildContext._check_rust_cargo_experimental_flag") + @patch("samcli.commands.build.build_context.BuildContext._check_build_method_experimental_flag") @patch("samcli.lib.build.app_builder.ApplicationBuilder.build") @patch("samcli.lib.telemetry.event.EventTracker.track_event") def test_build_in_source_event_sent(