{"record":{"id":"36bd4c61cf7392ad","repo":"oraios/serena","slug":"the-given-package-object-package-or-version-has","errorCode":null,"errorMessage":"The given package object {package_or_version} has no __version__ attribute","messagePattern":"The given package object (.+?) has no __version__ attribute","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/serena/util/version.py","lineNumber":19,"sourceCode":"class Version:\n    \"\"\"\n    Represents a version, specifically the numeric components of a version string.\n\n    Suffixes like \"rc1\" or \"-dev\" are ignored, i.e. for a version string like \"1.2.3rc1\",\n    the components are [1, 2, 3].\n    \"\"\"\n\n    def __init__(self, package_or_version: object | str):\n        \"\"\"\n        :param package_or_version: a package object (with a `__version__` attribute) or a version string like \"1.2.3\".\n            If a version contains a suffix (like \"1.2.3rc1\" or \"1.2.3-dev\"), the suffix is ignored.\n        \"\"\"\n        if isinstance(package_or_version, str):\n            version_string = package_or_version\n        elif hasattr(package_or_version, \"__version__\"):\n            package_version_string = getattr(package_or_version, \"__version__\", None)\n            if package_version_string is None:\n                raise ValueError(f\"The given package object {package_or_version} has no __version__ attribute\")\n            version_string = package_version_string\n        else:\n            raise ValueError(\"The given argument must be either a version string or a package object with a __version__ attribute\")\n        self.version_string = version_string\n        self.components = self._get_version_components(version_string)\n\n    def __repr__(self) -> str:\n        return self.version_string\n\n    @staticmethod\n    def _get_version_components(version_string: str) -> list[int]:\n        components = version_string.split(\".\")\n        int_components = []\n        for c in components:\n            num_str = \"\"\n            for ch in c:\n                if ch.isdigit():\n                    num_str += ch","sourceCodeStart":1,"sourceCodeEnd":37,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/util/version.py#L1-L37","documentation":"Version's __init__ accepts either a version string or a package object; when a package object is passed but getattr(obj, '__version__') returns None, it raises claiming the object has no __version__ attribute. This guards against constructing a Version from an object with a missing/None version metadata field.","triggerScenarios":"Passing a module or object where __version__ exists but is explicitly None (e.g. a package whose metadata wasn't populated), so hasattr passes but the value is None.","commonSituations":"Namespace packages or locally imported stubs lacking version metadata; packages installed without proper metadata; passing a wrapper class instead of the module itself.","solutions":["Pass the version string directly: Version('1.2.3') instead of Version(module)","Ensure the package's __version__ is set (proper install/metadata generation)","Check with getattr(mod, '__version__', None) before constructing and handle None"],"exampleFix":"// before\nVersion(some_pkg)  # some_pkg.__version__ is None\n// after\nver = getattr(some_pkg, '__version__', None)\nif ver is None:\n    ver = importlib.metadata.version('some-pkg')\nVersion(ver)","handlingStrategy":"type-guard","validationCode":"ver = getattr(pkg, '__version__', None)\nif ver is None:\n    ver = importlib.metadata.version(pkg.__name__)\nVersion(ver)","typeGuard":"def has_version(obj: object) -> TypeGuard[object]:\n    return getattr(obj, '__version__', None) is not None","tryCatchPattern":"try:\n    v = Version(pkg_or_str)\nexcept ValueError as e:\n    if 'has no __version__' in str(e):\n        v = Version(importlib.metadata.version('the-package'))\n    else:\n        raise","preventionTips":["Prefer passing explicit version strings","Check getattr(obj,'__version__',None) before constructing","Ensure packages are installed with complete metadata"],"tags":["versioning","metadata","validation"],"backgroundTag":"missing-package-version-metadata","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}