(self, requirement, prereleases=False)
return result
Find the most recent distribution which matches the given
        requirement.

        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
                            'foo (>= 1.0, < 2.0, != 1.3)'
        :param prereleases: If ``True``, allow pre-release versions
                            to be located. Otherwise, pre-release versions
                            are not returned.
        :return: A :class:`Distribution` instance, or ``None`` if no such
                 distribution could be located.
Find the most recent distribution which matches the given
        requirement.
Find the most recent distribution which matches the given requirement .
def locate(self, requirement, prereleases=False):
        """
        Find the most recent distribution which matches the given
        requirement.

        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
                            'foo (>= 1.0, < 2.0, != 1.3)'
        :param prereleases: If ``True``, allow pre-release versions
                            to be located. Otherwise, pre-release versions
                            are not returned.
        :return: A :class:`Distribution` instance, or ``None`` if no such
                 distribution could be located.
        """
        result = None
        r = parse_requirement(requirement)
        if r is None:  # pragma: no cover
            raise DistlibException('Not a valid requirement: %r' % requirement)
        scheme = get_scheme(self.scheme)
        self.matcher = matcher = scheme.matcher(r.requirement)
        logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
        versions = self.get_project(r.name)
        if len(versions) > 2:   # urls and digests keys are present
            # sometimes, versions are invalid
            slist = []
            vcls = matcher.version_class
            for k in versions:
                if k in ('urls', 'digests'):
                    continue
                try:
                    if not matcher.match(k):
                        logger.debug('%s did not match %r', matcher, k)
                    else:
                        if prereleases or not vcls(k).is_prerelease:
                            slist.append(k)
                        else:
                            logger.debug('skipping pre-release '
                                         'version %s of %s', k, matcher.name)
                except Exception:  # pragma: no cover
                    logger.warning('error matching %s with %r', matcher, k)
                    pass # slist.append(k)
            if len(slist) > 1:
                slist = sorted(slist, key=scheme.key)
            if slist:
                logger.debug('sorted list: %s', slist)
                version = slist[-1]
                result = versions[version]
        if result:
            if r.extras:
                result.extras = r.extras
            result.download_urls = versions.get('urls', {}).get(version, set())
            d = {}
            sd = versions.get('digests', {})
            for url in result.download_urls:
                if url in sd:  # pragma: no cover
                    d[url] = sd[url]
            result.digests = d
        self.matcher = None
        return result
def locate ( self , requirement , prereleases = False ) : result = None r = parse_requirement ( requirement ) if r is None : # pragma: no cover raise DistlibException ( 'Not a valid requirement: %r' % requirement ) scheme = get_scheme ( self . scheme ) self . matcher = matcher = scheme . matcher ( r . requirement ) logger . debug ( 'matcher: %s (%s)' , matcher , type ( matcher ) . __name__ ) versions = self . get_project ( r . name ) if len ( versions ) > 2 : # urls and digests keys are present # sometimes, versions are invalid slist = [ ] vcls = matcher . version_class for k in versions : if k in ( 'urls' , 'digests' ) : continue try : if not matcher . match ( k ) : logger . debug ( '%s did not match %r' , matcher , k ) else : if prereleases or not vcls ( k ) . is_prerelease : slist . append ( k ) else : logger . debug ( 'skipping pre-release ' 'version %s of %s' , k , matcher . name ) except Exception : # pragma: no cover logger . warning ( 'error matching %s with %r' , matcher , k ) pass # slist.append(k) if len ( slist ) > 1 : slist = sorted ( slist , key = scheme . key ) if slist : logger . debug ( 'sorted list: %s' , slist ) version = slist [ - 1 ] result = versions [ version ] if result : if r . extras : result . extras = r . extras result . download_urls = versions . get ( 'urls' , { } ) . get ( version , set ( ) ) d = { } sd = versions . get ( 'digests' , { } ) for url in result . download_urls : if url in sd : # pragma: no cover d [ url ] = sd [ url ] result . digests = d self . matcher = None return result