Пример #1
0
    def test_urls(self, db_session, home_page, download_url, project_urls,
                  expected):
        release = DBReleaseFactory.create(home_page=home_page,
                                          download_url=download_url)

        for urlspec in project_urls:
            db_session.add(
                Dependency(
                    release=release,
                    kind=DependencyKind.project_url.value,
                    specifier=urlspec,
                ))

        # TODO: It'd be nice to test for the actual ordering here.
        assert dict(release.urls) == dict(expected)
Пример #2
0
def _construct_dependencies(form, types):
    for name, kind in types.items():
        for item in getattr(form, name).data:
            yield Dependency(kind=kind.value, specifier=item)
Пример #3
0
    def test_detail_renders(self, pyramid_config, db_request, db_session):
        project = ProjectFactory.create(has_docs=True)
        description_content_type = "text/x-rst"
        url = "/the/fake/url/"
        project_urls = [
            "url," + url,
            "Homepage,https://example.com/home2/",
            "Source Code,https://example.com/source-code/",
            "uri,http://[email protected]:123/forum/questions/?tag=networking&order=newest#top",  # noqa: E501
            "ldap,ldap://[2001:db8::7]/c=GB?objectClass?one",
            "tel,tel:+1-816-555-1212",
            "telnet,telnet://192.0.2.16:80/",
            "urn,urn:oasis:names:specification:docbook:dtd:xml:4.1.2",
            "reservedchars,http://example.com?&$+/:;=@#",  # Commas don't work!
            r"unsafechars,http://example.com <>[]{}|\^%",
        ]
        expected_urls = []
        for project_url in reversed(project_urls):
            expected_urls.append(tuple(project_url.split(",")))
        expected_urls = OrderedDict(tuple(expected_urls))

        releases = [
            ReleaseFactory.create(project=project, version=v)
            for v in ["0.1", "1.0", "2.0"]
        ]
        releases += [
            ReleaseFactory.create(
                project=project,
                version="3.0",
                description_content_type=description_content_type,
            )
        ]

        for urlspec in project_urls:
            db_session.add(
                Dependency(
                    release=releases[3],
                    kind=DependencyKind.project_url.value,
                    specifier=urlspec,
                ))

        files = [
            FileFactory.create(
                release=r,
                filename="{}-{}.tar.gz".format(project.name, r.version),
                python_version="source",
                size=200,
                has_signature=True,
            ) for r in releases[1:]
        ]
        user = UserFactory.create()
        JournalEntryFactory.reset_sequence()
        je = JournalEntryFactory.create(name=project.name, submitted_by=user)

        db_request.route_url = pretend.call_recorder(lambda *args, **kw: url)

        result = json.json_release(releases[3], db_request)

        assert set(db_request.route_url.calls) == {
            pretend.call("packaging.file", path=files[0].path),
            pretend.call("packaging.file", path=files[1].path),
            pretend.call("packaging.file", path=files[2].path),
            pretend.call("packaging.project", name=project.name),
            pretend.call("packaging.release",
                         name=project.name,
                         version=releases[3].version),
            pretend.call("legacy.docs", project=project.name),
        }

        _assert_has_cors_headers(db_request.response.headers)
        assert db_request.response.headers["X-PyPI-Last-Serial"] == str(je.id)

        assert result == {
            "info": {
                "author": None,
                "author_email": None,
                "bugtrack_url": None,
                "classifiers": [],
                "description_content_type": description_content_type,
                "description": None,
                "docs_url": "/the/fake/url/",
                "download_url": None,
                "downloads": {
                    "last_day": -1,
                    "last_week": -1,
                    "last_month": -1
                },
                "home_page": None,
                "keywords": None,
                "license": None,
                "maintainer": None,
                "maintainer_email": None,
                "name": project.name,
                "package_url": "/the/fake/url/",
                "platform": None,
                "project_url": "/the/fake/url/",
                "project_urls": expected_urls,
                "release_url": "/the/fake/url/",
                "requires_dist": None,
                "requires_python": None,
                "summary": None,
                "version": "3.0",
            },
            "releases": {
                "0.1": [],
                "1.0": [{
                    "comment_text":
                    None,
                    "downloads":
                    -1,
                    "filename":
                    files[0].filename,
                    "has_sig":
                    True,
                    "md5_digest":
                    files[0].md5_digest,
                    "digests": {
                        "md5": files[0].md5_digest,
                        "sha256": files[0].sha256_digest,
                    },
                    "packagetype":
                    None,
                    "python_version":
                    "source",
                    "size":
                    200,
                    "upload_time":
                    files[0].upload_time.strftime("%Y-%m-%dT%H:%M:%S"),
                    "url":
                    "/the/fake/url/",
                    "requires_python":
                    None,
                }],
                "2.0": [{
                    "comment_text":
                    None,
                    "downloads":
                    -1,
                    "filename":
                    files[1].filename,
                    "has_sig":
                    True,
                    "md5_digest":
                    files[1].md5_digest,
                    "digests": {
                        "md5": files[1].md5_digest,
                        "sha256": files[1].sha256_digest,
                    },
                    "packagetype":
                    None,
                    "python_version":
                    "source",
                    "size":
                    200,
                    "upload_time":
                    files[1].upload_time.strftime("%Y-%m-%dT%H:%M:%S"),
                    "url":
                    "/the/fake/url/",
                    "requires_python":
                    None,
                }],
                "3.0": [{
                    "comment_text":
                    None,
                    "downloads":
                    -1,
                    "filename":
                    files[2].filename,
                    "has_sig":
                    True,
                    "md5_digest":
                    files[2].md5_digest,
                    "digests": {
                        "md5": files[2].md5_digest,
                        "sha256": files[2].sha256_digest,
                    },
                    "packagetype":
                    None,
                    "python_version":
                    "source",
                    "size":
                    200,
                    "upload_time":
                    files[2].upload_time.strftime("%Y-%m-%dT%H:%M:%S"),
                    "url":
                    "/the/fake/url/",
                    "requires_python":
                    None,
                }],
            },
            "urls": [{
                "comment_text":
                None,
                "downloads":
                -1,
                "filename":
                files[2].filename,
                "has_sig":
                True,
                "md5_digest":
                files[2].md5_digest,
                "digests": {
                    "md5": files[2].md5_digest,
                    "sha256": files[2].sha256_digest,
                },
                "packagetype":
                None,
                "python_version":
                "source",
                "size":
                200,
                "upload_time":
                files[2].upload_time.strftime("%Y-%m-%dT%H:%M:%S"),
                "url":
                "/the/fake/url/",
                "requires_python":
                None,
            }],
            "last_serial":
            je.id,
        }