{"id":"c73aa4b9692cd042","repo":"python-poetry/poetry","slug":"package-name-version-not-found","errorCode":null,"errorMessage":"Package {name} ({version}) not found.","messagePattern":"Package (.+?) \\((.+?)\\) not found\\.","errorType":"exception","errorClass":"PackageNotFoundError","httpStatus":null,"severity":"error","filePath":"src/poetry/repositories/repository.py","lineNumber":114,"sourceCode":"        ]\n\n    def _log(self, msg: str, level: str = \"info\") -> None:\n        logger = logging.getLogger(f\"{__name__}.{self.__class__.__name__}\")\n        getattr(logger, level)(f\"<c1>Source ({self.name}):</c1> {msg}\")\n\n    def __len__(self) -> int:\n        return len(self._packages)\n\n    def find_links_for_package(self, package: Package) -> list[Link]:\n        return []\n\n    def package(self, name: str, version: Version) -> Package:\n        canonicalized_name = canonicalize_name(name)\n        for package in self.packages:\n            if canonicalized_name == package.name and package.version == version:\n                return package\n\n        raise PackageNotFoundError(f\"Package {name} ({version}) not found.\")\n\n    def log_age_filtered_versions(self, *, level: str, reset: bool) -> None:\n        \"\"\"Log package versions that were ignored due to solver.min-release-age.\n\n        Must be overridden in Repository classes that support filtering by release age.\n\n        Args:\n            level: The log level to use (e.g. \"info\", \"warning\").\n            reset: If True, clear the recorded filtered versions after logging.\n        \"\"\"\n","sourceCodeStart":96,"sourceCodeEnd":125,"githubUrl":"https://github.com/python-poetry/poetry/blob/92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54/src/poetry/repositories/repository.py#L96-L125","documentation":"Raised by the base Repository.package when no in-memory package matches both the canonical name and exact version (repository.py:108-114). This is the generic lookup miss for repositories that hold a fixed set of packages (e.g. LockedRepository or an in-memory/test repository), not for remote HTTP repositories.","triggerScenarios":"Calling repo.package(name, version) on a LockedRepository whose lock does not contain that package/version, or on any Repository subclass that relies on the default package() implementation.","commonSituations":"Lock file out of sync with pyproject.toml; querying a repository object that was populated for a different package set; programmatic use of a custom Repository.","solutions":["Refresh the lock with `poetry lock --no-update` or `poetry lock`.","Confirm the package/version is actually in repository.packages before calling .package().","If using a custom Repository, ensure it is populated with the packages you query."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from poetry.core.constraints.version import Version\ntarget = (canonicalize_name(name), version)\nif not any((p.name, p.version) == target for p in repository.packages):\n    raise KeyError(f\"{name} {version} not in repository; refresh lock\")\npkg = repository.package(name, version)","typeGuard":null,"tryCatchPattern":"from poetry.repositories.exceptions import PackageNotFoundError\ntry:\n    pkg = repository.package(name, version)\nexcept PackageNotFoundError:\n    log.warning(\"%s %s missing from %s; re-lock\", name, version, repository.name)\n    raise","preventionTips":["Keep poetry.lock committed and in sync with pyproject.toml.","Run `poetry lock --no-update` after dependency edits.","Validate against repository.packages before exact-version lookups."],"tags":["repository","package-not-found","lockfile"],"analyzedSha":"92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54","analyzedAt":"2026-08-04T20:33:34.072Z","schemaVersion":2}