From 449c43a58fe7b006363d3d358c04131f1682ea65 Mon Sep 17 00:00:00 2001 From: carschandler <92899389+carschandler@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:48:33 -0500 Subject: [PATCH] Fix codeartifact login --namespace to accept uppercase characters The npm scope name regex in NpmLogin.get_scope() only allowed lowercase letters (a-z), causing valid namespace values containing uppercase characters to be rejected with a misleading error about URL-safe characters. npm scopes are case-insensitive, so uppercase letters should be permitted. This adds A-Z to both character classes in the regex and adds a corresponding unit test. Fixes #10207 --- awscli/customizations/codeartifact/login.py | 2 +- tests/unit/customizations/codeartifact/test_adapter_login.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/awscli/customizations/codeartifact/login.py b/awscli/customizations/codeartifact/login.py index ff8818b0ba8a..b6f1e2a376fe 100644 --- a/awscli/customizations/codeartifact/login.py +++ b/awscli/customizations/codeartifact/login.py @@ -469,7 +469,7 @@ def _run_command(self, tool, command): @classmethod def get_scope(cls, namespace): # Regex for valid scope name - valid_scope_name = re.compile('^(@[a-z0-9-~][a-z0-9-._~]*)') + valid_scope_name = re.compile('^(@[a-zA-Z0-9-~][a-zA-Z0-9-._~]*)') if namespace is None: return namespace diff --git a/tests/unit/customizations/codeartifact/test_adapter_login.py b/tests/unit/customizations/codeartifact/test_adapter_login.py index 553d977647c2..13fd3970977e 100644 --- a/tests/unit/customizations/codeartifact/test_adapter_login.py +++ b/tests/unit/customizations/codeartifact/test_adapter_login.py @@ -1083,6 +1083,11 @@ def test_get_scope_without_prefix(self): scope = self.test_subject.get_scope(f'@{self.namespace}') self.assertEqual(scope, expected_value) + def test_get_scope_with_uppercase(self): + expected_value = '@Transform9' + scope = self.test_subject.get_scope('Transform9') + self.assertEqual(scope, expected_value) + def test_get_commands(self): commands = self.test_subject.get_commands( self.endpoint, self.auth_token