def _get_constraints_from_dependency( dependency: Dependency, ) -> tuple[VersionConstraint, bool]: constraint = dependency.constraint if constraint is None: constraint = "*" if not isinstance(constraint, VersionConstraint): constraint = parse_constraint(constraint) allow_prereleases = dependency.allows_prereleases() if isinstance(constraint, VersionRange) and ( constraint.max is not None and constraint.max.is_unstable() or constraint.min is not None and constraint.min.is_unstable()): allow_prereleases = True return constraint, allow_prereleases
def find_packages(self, dependency: Dependency) -> list[Package]: from poetry.core.semver.helpers import parse_constraint from poetry.core.semver.version_constraint import VersionConstraint from poetry.core.semver.version_range import VersionRange constraint = dependency.constraint packages = [] ignored_pre_release_packages = [] if constraint is None: constraint = "*" if not isinstance(constraint, VersionConstraint): constraint = parse_constraint(constraint) allow_prereleases = dependency.allows_prereleases() if isinstance(constraint, VersionRange) and ( constraint.max is not None and constraint.max.is_unstable() or constraint.min is not None and constraint.min.is_unstable()): allow_prereleases = True for package in self.packages: if dependency.name == package.name: if (package.is_prerelease() and not allow_prereleases and not package.source_type): # If prereleases are not allowed and the package is a prerelease # and is a standard package then we skip it if constraint.is_any(): # we need this when all versions of the package are pre-releases ignored_pre_release_packages.append(package) continue if constraint.allows(package.version) or ( package.is_prerelease() and constraint.allows(package.version.next_patch())): packages.append(package) return packages or ignored_pre_release_packages
def find_packages(self, dependency: Dependency) -> List[Package]: """ Find packages on the remote server. """ constraint = dependency.constraint if constraint is None: constraint = "*" if not isinstance(constraint, VersionConstraint): constraint = parse_constraint(constraint) allow_prereleases = dependency.allows_prereleases() if isinstance(constraint, VersionRange) and ( constraint.max is not None and constraint.max.is_unstable() or constraint.min is not None and constraint.min.is_unstable()): allow_prereleases = True try: info = self.get_package_info(dependency.name) except PackageNotFound: self._log( f"No packages found for {dependency.name} {constraint!s}", level="debug", ) return [] packages = [] ignored_pre_release_packages = [] for version, release in info["releases"].items(): if not release: # Bad release self._log( f"No release information found for {dependency.name}-{version}, skipping", level="debug", ) continue try: package = Package(info["info"]["name"], version) except InvalidVersion: self._log( f'Unable to parse version "{version}" for the {dependency.name} package, skipping', level="debug", ) continue if package.is_prerelease() and not allow_prereleases: if constraint.is_any(): # we need this when all versions of the package are pre-releases ignored_pre_release_packages.append(package) continue if not constraint or (constraint and constraint.allows(package.version)): packages.append(package) self._log( f"{len(packages)} packages found for {dependency.name} {constraint!s}", level="debug", ) return packages or ignored_pre_release_packages
def find_packages(self, dependency: Dependency) -> list[Package]: packages = [] constraint = dependency.constraint if constraint is None: constraint = "*" if not isinstance(constraint, VersionConstraint): constraint = parse_constraint(constraint) allow_prereleases = dependency.allows_prereleases() if isinstance(constraint, VersionRange) and ( constraint.max is not None and constraint.max.is_unstable() or constraint.min is not None and constraint.min.is_unstable()): allow_prereleases = True key = dependency.name if not constraint.is_any(): key = f"{key}:{constraint!s}" ignored_pre_release_versions = [] if self._cache.store("matches").has(key): versions = self._cache.store("matches").get(key) else: page = self._get_page(f"/{dependency.name.replace('.', '-')}/") if page is None: return [] versions = [] for version in page.versions: if version.is_unstable() and not allow_prereleases: if constraint.is_any(): # we need this when all versions of the package are pre-releases ignored_pre_release_versions.append(version) continue if constraint.allows(version): versions.append(version) self._cache.store("matches").put(key, versions, 5) for package_versions in (versions, ignored_pre_release_versions): for version in package_versions: package = Package( dependency.name, version, source_type="legacy", source_reference=self.name, source_url=self._url, ) packages.append(package) self._log( f"{len(packages)} packages found for {dependency.name} {constraint!s}", level="debug", ) if packages or not constraint.is_any(): # we have matching packages, or constraint is not (*) break return packages