{"id":"6996914d6bc10042","repo":"redis/redis-py","slug":"upstream-driver-name-must-use-a-python-package-sty","errorCode":null,"errorMessage":"Upstream driver name must use a Python package-style name: start with a lowercase letter and contain only lowercase letters, digits, hyphens, and underscores (e.g., 'django-redis').","messagePattern":"Upstream driver name must use a Python package-style name: start with a lowercase letter and contain only lowercase letters, digits, hyphens, and underscores \\(e\\.g\\., 'django-redis'\\)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"redis/driver_info.py","lineNumber":42,"sourceCode":"\n\ndef _validate_driver_name(name: str) -> None:\n    \"\"\"Validate an upstream driver name.\n\n    The name should look like a typical Python distribution or package name,\n    following a simplified form of PEP 503 normalisation rules:\n\n    * start with a lowercase ASCII letter\n    * contain only lowercase letters, digits, hyphens and underscores\n\n    Examples of valid names: ``\"django-redis\"``, ``\"celery\"``, ``\"rq\"``.\n    \"\"\"\n\n    import re\n\n    _validate_no_invalid_chars(name, \"Driver name\")\n    if not re.match(r\"^[a-z][a-z0-9_-]*$\", name):\n        raise ValueError(\n            \"Upstream driver name must use a Python package-style name: \"\n            \"start with a lowercase letter and contain only lowercase letters, \"\n            \"digits, hyphens, and underscores (e.g., 'django-redis').\"\n        )\n\n\ndef _validate_driver_version(version: str) -> None:\n    _validate_no_invalid_chars(version, \"Driver version\")\n\n\ndef _format_driver_entry(driver_name: str, driver_version: str) -> str:\n    return f\"{driver_name}_v{driver_version}\"\n\n\n@dataclass\nclass DriverInfo:\n    \"\"\"Driver information used to build the CLIENT SETINFO LIB-NAME and LIB-VER values.\n","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/redis/redis-py/blob/da03cdc7e8731092b13e395605c3c1fb2de25de1/redis/driver_info.py#L24-L60","documentation":"Raised as ValueError by _validate_driver_name (redis/driver_info.py:42). Beyond the character check, an upstream driver name must match ^[a-z][a-z0-9_-]*$ — start with a lowercase letter and contain only lowercase letters, digits, hyphens, underscores — following a simplified PEP 503 normalization so it is a valid Python-distribution-style identifier (e.g. 'django-redis').","triggerScenarios":"Calling DriverInfo().add_upstream_driver(name, ...) with a name starting with a digit, containing an uppercase letter, a dot, a slash, or any character outside [a-z0-9_-].","commonSituations":"Passing a package import path (e.g. 'django_redis' is fine, but 'Django.Redis' is not); a name starting with a digit; using the distribution title with a capital letter; embedding a version or path separator in the name.","solutions":["Normalize the name to lowercase ASCII with hyphens/underscores, starting with a letter: e.g. 'django-redis'.","Move any version into the version argument, not the name.","Lowercase and replace disallowed separators before passing: name.lower().replace('.','-')."],"exampleFix":"// before\ninfo.add_upstream_driver('Django.Redis', '5.4.0')\n\n// after\ninfo.add_upstream_driver('django-redis', '5.4.0')","handlingStrategy":"validation","validationCode":"import re\n_NAME = re.compile(r'^[a-z][a-z0-9_-]*$')\ndef normalize_driver_name(name: str) -> str:\n    n = name.strip().lower().replace('.', '-').replace(' ', '-')\n    if not _NAME.match(n):\n        raise ValueError(f'invalid driver name: {name!r}')\n    return n\ninfo.add_upstream_driver(normalize_driver_name(name), version)","typeGuard":"import re\n_DRIVER_NAME = re.compile(r'^[a-z][a-z0-9_-]*$')\ndef is_valid_driver_name(name) -> bool:\n    return isinstance(name, str) and bool(_DRIVER_NAME.match(name))","tryCatchPattern":null,"preventionTips":["Keep the name lowercase, letter-first, hyphen/underscore/digit only — think PyPI distribution name.","Put the version in the version argument, not the name.","Normalize names at the boundary: .lower().replace('.', '-') before validation.","Avoid uppercase letters, dots, slashes, and leading digits in driver names."],"tags":["driver-info","client-setinfo","validation","valueerror","naming"],"analyzedSha":"da03cdc7e8731092b13e395605c3c1fb2de25de1","analyzedAt":"2026-08-04T20:26:47.563Z","schemaVersion":2}