{"record":{"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":"exception","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/6a6b581b48225afa0b76912d1028c6035baee932/redis/driver_info.py#L24-L60","documentation":"_validate_driver_name (redis/driver_info.py:42) enforces that an upstream driver name matches ^[a-z][a-z0-9_-]*$ — a simplified PEP 503 distribution-name rule. add_upstream_driver calls this so the encoded LIB-NAME (name(driver_vver;...)) stays parseable and matches conventions used by other Redis clients. Names with uppercase letters, leading digits, dots, slashes, spaces, or unicode are rejected.","triggerScenarios":"driver_info.add_upstream_driver('Django-Redis', '5.4.0') (uppercase), add_upstream_driver('4redis', ...) (leading digit), add_upstream_driver('my.driver', ...) (dot), add_upstream_driver('django redis', ...) (space). The call happens when a higher-level driver (django-redis, celery, rq) registers itself with redis-py.","commonSituations":"A framework wrapping redis-py auto-registering its package metadata without normalizing the project name to lower-case PEP 503 form; reading the name from a PyPI title that has mixed case.","solutions":["Normalize the package name: lower-case it and run re.sub(r'[-_.]+', '-', name) before passing to add_upstream_driver.","Start the name with a lowercase ASCII letter and use only lowercase letters, digits, hyphens, underscores.","Add a unit test that feeds your package metadata through the normalizer so CI catches a bad name before release."],"exampleFix":"// before\ninfo.add_upstream_driver(importlib.metadata.metadata('My-Pkg')['Name'], VERSION)\n// after\nimport re\nraw = importlib.metadata.metadata('My-Pkg')['Name']\nname = re.sub(r'[-_.]+', '-', raw).lower()\ninfo.add_upstream_driver(name, VERSION)","handlingStrategy":"validation","validationCode":"import re\ndef normalize_driver_name(name: str) -> str:\n    return re.sub(r'[-_.]+', '-', name.strip()).lower()\ndef is_valid_driver_name(name: str) -> bool:\n    return bool(re.match(r'^[a-z][a-z0-9_-]*$', name))","typeGuard":"import re\ndef is_valid_driver_name(name) -> bool:\n    return isinstance(name, str) and bool(re.match(r'^[a-z][a-z0-9_-]*$', name))","tryCatchPattern":null,"preventionTips":["Normalize package names to PEP 503 form (lower-case, runs of -_. collapsed to -) before registering.","Add a CI test that runs your package name through the normalizer.","Never derive the driver name from user/free-form input without sanitizing."],"tags":["driver-info","validation","pep503","upstream-driver"],"backgroundTag":null,"analyzedSha":"6a6b581b48225afa0b76912d1028c6035baee932","analyzedAt":"2026-08-10T12:52:44.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}