예제 #1
0
    def test_append(self):
        # When adding a new item to the list, the behavior is to test if
        # a release with the same name and version number already exists,
        # and if so, to add a new distribution for it. If the distribution type
        # is already defined too, add url informations to the existing DistInfo
        # object.

        releases = ReleasesList("FooBar", [
            ReleaseInfo("FooBar", "1.1", url="external_url",
                        dist_type="sdist"),
        ])
        self.assertEqual(1, len(releases))
        releases.add_release(release=ReleaseInfo("FooBar",
                                                 "1.1",
                                                 url="internal_url",
                                                 is_external=False,
                                                 dist_type="sdist"))
        self.assertEqual(1, len(releases))
        self.assertEqual(2, len(releases[0]['sdist'].urls))

        releases.add_release(
            release=ReleaseInfo("FooBar", "1.1.1", dist_type="sdist"))
        self.assertEqual(2, len(releases))

        # when adding a distribution whith a different type, a new distribution
        # has to be added.
        releases.add_release(
            release=ReleaseInfo("FooBar", "1.1.1", dist_type="bdist"))
        self.assertEqual(2, len(releases))
        self.assertEqual(2, len(releases[1].dists))
예제 #2
0
    def get_releases(self,
                     requirements,
                     prefer_final=None,
                     show_hidden=True,
                     force_update=False):
        """Return the list of existing releases for a specific project.

        Cache the results from one call to another.

        If show_hidden is True, return the hidden releases too.
        If force_update is True, reprocess the index to update the
        informations (eg. make a new XML-RPC call).
        ::

            >>> client = Client()
            >>> client.get_releases('Foo')
            ['1.1', '1.2', '1.3']

        If no such project exists, raise a ProjectNotFound exception::

            >>> client.get_project_versions('UnexistingProject')
            ProjectNotFound: UnexistingProject

        """
        def get_versions(project_name, show_hidden):
            return self.proxy.package_releases(project_name, show_hidden)

        predicate = get_version_predicate(requirements)
        prefer_final = self._get_prefer_final(prefer_final)
        project_name = predicate.name
        if not force_update and (project_name.lower() in self._projects):
            project = self._projects[project_name.lower()]
            if not project.contains_hidden and show_hidden:
                # if hidden releases are requested, and have an existing
                # list of releases that does not contains hidden ones
                all_versions = get_versions(project_name, show_hidden)
                existing_versions = project.get_versions()
                hidden_versions = set(all_versions) - set(existing_versions)
                for version in hidden_versions:
                    project.add_release(release=ReleaseInfo(
                        project_name, version, index=self._index))
        else:
            versions = get_versions(project_name, show_hidden)
            if not versions:
                raise ProjectNotFound(project_name)
            project = self._get_project(project_name)
            project.add_releases([
                ReleaseInfo(project_name, version, index=self._index)
                for version in versions
            ])
        project = project.filter(predicate)
        if len(project) == 0:
            raise ReleaseNotFound("%s" % predicate)
        project.sort_releases(prefer_final)
        return project
예제 #3
0
    def test_comparison(self):
        # Test that we can compare DistInfoributionInfoList
        foo1 = ReleaseInfo("foo", "1.0")
        foo2 = ReleaseInfo("foo", "2.0")
        bar = ReleaseInfo("bar", "2.0")
        # assert we use the version to compare
        self.assertTrue(foo1 < foo2)
        self.assertFalse(foo1 > foo2)
        self.assertFalse(foo1 == foo2)

        # assert we can't compare dists with different names
        self.assertRaises(TypeError, foo1.__eq__, bar)
예제 #4
0
    def test_prefer_final(self):
        # Can order the distributions using prefer_final
        fb10 = ReleaseInfo("FooBar", "1.0")  # final distribution
        fb11a = ReleaseInfo("FooBar", "1.1a1")  # alpha
        fb12a = ReleaseInfo("FooBar", "1.2a1")  # alpha
        fb12b = ReleaseInfo("FooBar", "1.2b1")  # beta
        dists = ReleasesList("FooBar", [fb10, fb11a, fb12a, fb12b])

        dists.sort_releases(prefer_final=True)
        self.assertEqual(fb10, dists[0])

        dists.sort_releases(prefer_final=False)
        self.assertEqual(fb12b, dists[0])
예제 #5
0
 def test_filter(self):
     # Test we filter the distributions the right way, using version
     # predicate match method
     releases = ReleasesList('FooBar', (
         ReleaseInfo("FooBar", "1.1"),
         ReleaseInfo("FooBar", "1.1.1"),
         ReleaseInfo("FooBar", "1.2"),
         ReleaseInfo("FooBar", "1.2.1"),
     ))
     filtered = releases.filter(VersionPredicate("FooBar (<1.2)"))
     self.assertNotIn(releases[2], filtered)
     self.assertNotIn(releases[3], filtered)
     self.assertIn(releases[0], filtered)
     self.assertIn(releases[1], filtered)
예제 #6
0
    def get_metadata(self, project_name, version):
        """Retrieve project metadata.

        Return a ReleaseInfo object, with metadata informations filled in.
        """
        # to be case-insensitive, get the informations from the XMLRPC API
        projects = [
            d['name'] for d in self.proxy.search({'name': project_name})
            if d['name'].lower() == project_name
        ]
        if len(projects) > 0:
            project_name = projects[0]

        metadata = self.proxy.release_data(project_name, version)
        project = self._get_project(project_name)
        if version not in project.get_versions():
            project.add_release(
                release=ReleaseInfo(project_name, version, index=self._index))
        release = project.get_release(version)
        release.set_metadata(metadata)
        return release
예제 #7
0
    def search_projects(self, name=None, operator="or", **kwargs):
        """Find using the keys provided in kwargs.

        You can set operator to "and" or "or".
        """
        for key in kwargs:
            if key not in _SEARCH_FIELDS:
                raise InvalidSearchField(key)
        if name:
            kwargs["name"] = name
        projects = self.proxy.search(kwargs, operator)
        for p in projects:
            project = self._get_project(p['name'])
            try:
                project.add_release(
                    release=ReleaseInfo(p['name'],
                                        p['version'],
                                        metadata={'summary': p['summary']},
                                        index=self._index))
            except IrrationalVersionError as e:
                logger.warning("Irrational version error found: %s", e)
        return [self._projects[p['name'].lower()] for p in projects]
예제 #8
0
    def get_distributions(self, project_name, version):
        """Grab informations about distributions from XML-RPC.

        Return a ReleaseInfo object, with distribution-related informations
        filled in.
        """
        url_infos = self.proxy.release_urls(project_name, version)
        project = self._get_project(project_name)
        if version not in project.get_versions():
            project.add_release(
                release=ReleaseInfo(project_name, version, index=self._index))
        release = project.get_release(version)
        for info in url_infos:
            packagetype = info['packagetype']
            dist_infos = {
                'url': info['url'],
                'hashval': info['md5_digest'],
                'hashname': 'md5',
                'is_external': False,
                'python_version': info['python_version']
            }
            release.add_distribution(packagetype, **dist_infos)
        return release
예제 #9
0
 def test_add_dist(self):
     # empty distribution type should assume "sdist"
     release = ReleaseInfo("FooBar", "1.1")
     release.add_distribution(url="http://example.org/")
     # should not fail
     release['sdist']
예제 #10
0
 def test_add_dist(self):
     # empty distribution type should assume "sdist"
     release = ReleaseInfo("FooBar", "1.1")
     release.add_distribution(url="http://example.org/")
     # should not fail
     release['sdist']
예제 #11
0
 def test_instantiation(self):
     # Test the DistInfo class provides us the good attributes when
     # given on construction
     release = ReleaseInfo("FooBar", "1.1")
     self.assertEqual("FooBar", release.name)
     self.assertEqual("1.1", "%s" % release.version)