diff --git a/tests/unit/packaging/test_views.py b/tests/unit/packaging/test_views.py index ad6d01445df5..b7c2c0a3a463 100644 --- a/tests/unit/packaging/test_views.py +++ b/tests/unit/packaging/test_views.py @@ -17,6 +17,7 @@ from warehouse.packaging import views from ...common.db.accounts import UserFactory +from ...common.db.classifiers import ClassifierFactory from ...common.db.packaging import ( ProjectFactory, ReleaseFactory, FileFactory, RoleFactory, ) @@ -131,4 +132,56 @@ def test_detail_renders(self, db_request): (r.version, r.created) for r in reversed(releases) ], "maintainers": sorted(users, key=lambda u: u.username.lower()), + "license": None } + + def test_license_from_classifier(self, db_request): + """A license label is added when a license classifier exists.""" + other_classifier = ClassifierFactory.create( + classifier="Some :: Random :: Classifier") + classifier = ClassifierFactory.create( + classifier="License :: OSI Approved :: BSD License") + release = ReleaseFactory.create( + _classifiers=[other_classifier, classifier], + license="Will not be used") + + result = views.release_detail(release, db_request) + + assert result["license"] == "BSD License" + + def test_license_with_no_classifier(self, db_request): + """With no classifier, a license is used from metadata.""" + release = ReleaseFactory.create(license="MIT License") + + result = views.release_detail(release, db_request) + + assert result["license"] == "MIT License" + + def test_multiline_license(self, db_request): + """When license metadata is longer than one line, the first is used.""" + release = ReleaseFactory.create( + license="Multiline License\nhow terrible") + + result = views.release_detail(release, db_request) + + assert result["license"] == "Multiline License" + + def test_no_license(self, db_request): + """With no license classifier or metadata, no license is in context.""" + release = ReleaseFactory.create() + + result = views.release_detail(release, db_request) + + assert result["license"] is None + + def test_multiple_licenses_from_classifiers(self, db_request): + """A license label is added when multiple license classifiers exist.""" + license_1 = ClassifierFactory.create( + classifier="License :: OSI Approved :: BSD License") + license_2 = ClassifierFactory.create( + classifier="License :: OSI Approved :: MIT License") + release = ReleaseFactory.create(_classifiers=[license_1, license_2]) + + result = views.release_detail(release, db_request) + + assert result["license"] == "BSD License, MIT License" diff --git a/warehouse/packaging/views.py b/warehouse/packaging/views.py index 220e9104ad9d..9e63cc3a4030 100644 --- a/warehouse/packaging/views.py +++ b/warehouse/packaging/views.py @@ -92,10 +92,22 @@ def release_detail(release, request): ) ] + # Get the license from the classifiers or metadata, preferring classifiers. + license = None + if release.license: + # Make a best effort when the entire license text is given + # by using the first line only. + license = release.license.split('\n')[0] + license_classifiers = [c.split(" :: ")[-1] for c in release.classifiers + if c.startswith("License")] + if license_classifiers: + license = ', '.join(license_classifiers) + return { "project": project, "release": release, "files": release.files.all(), "all_releases": all_releases, "maintainers": maintainers, + "license": license, } diff --git a/warehouse/static/sass/blocks/_package-header.scss b/warehouse/static/sass/blocks/_package-header.scss index 8a218bdaccf6..92499c0802c3 100644 --- a/warehouse/static/sass/blocks/_package-header.scss +++ b/warehouse/static/sass/blocks/_package-header.scss @@ -30,14 +30,7 @@ } &__license { - padding-top: $spacing-unit / 2; - float: right; font-style: italic; - - @media only screen and (max-width: $tablet){ - padding-top: 0; - float: none; - } } &__name { diff --git a/warehouse/templates/packaging/detail.html b/warehouse/templates/packaging/detail.html index 2845e2ac2f96..cbd6dfef85e8 100644 --- a/warehouse/templates/packaging/detail.html +++ b/warehouse/templates/packaging/detail.html @@ -60,7 +60,6 @@
License: TODO
{% if release.summary %}{{ release.summary }}{% endif %}
@@ -70,6 +69,9 @@
License: {{ license }}
+ {% endif %}