diff --git a/pyporter/pyporter.py b/pyporter/pyporter.py index b4f0ce01c2b16a21dc9908db374c791f884a5174..7efc8b30be10e6f0560772e4dab22fc3018b3cea 100755 --- a/pyporter/pyporter.py +++ b/pyporter/pyporter.py @@ -160,13 +160,14 @@ class PyPorter: By default, the license info can be achieved from json["info"]["license"] in rare cases it doesn't work. We fall back to json["info"]["classifiers"], it looks like License :: OSI Approved :: BSD Clause + or License :: Public Domain, seems like the license is at the end """ if self.__json["info"]["license"] != "": return self.__json["info"]["license"] for k in self.__json["info"]["classifiers"]: if k.startswith("License"): ks = k.split("::") - return ks[2].strip() + return ks[-1].strip() return "" def get_source_info(self): @@ -506,7 +507,7 @@ def build_spec(porter, output): output = os.path.join(output, porter.get_spec_name() + ".spec") tmp = sys.stdout if output != "": - sys.stdout = open(output, 'w+') + sys.stdout = open(output, 'w+', encoding='utf-8') print("%global _empty_manifest_terminate_build 0") print(name_tag_template.format(pkg_name=porter.get_spec_name())) diff --git a/tests/TestLicense.json b/tests/TestLicense.json new file mode 100644 index 0000000000000000000000000000000000000000..044f2ca4a3c0be2f259b03e8392021771e912227 --- /dev/null +++ b/tests/TestLicense.json @@ -0,0 +1 @@ +{"info":{"author":"Roland Hedberg","author_email":"roland@catalogix.se","bugtrack_url":null,"classifiers":["Development Status :: 4 - Beta","License :: OSI Approved :: Apache Software License","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3.5","Topic :: Software Development :: Libraries :: Python Modules"],"description":"","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page": null,"keywords":"","license":"Apache 2.0","maintainer":"","maintainer_email":"","name":"pyjwkest","package_url":null,"platform":"","project_url":null,"project_urls":null,"release_url":"https://pypi.org/project/pyjwkest/1.4.2/","requires_dist":null,"requires_python":"","summary":"Python implementation of JWT, JWE, JWS and JWK","version":"1.4.2","yanked":false,"yanked_reason":null},"last_serial":5455412,"releases":{"1.4.2":[{"comment_text":"","digests":{"blake2b_256":"531713eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30","md5":"e5da7de4c94266b99b4c79f635d73991","sha256":"35ace8f52d87dd4d5b108e615882d04f40eb3151cc6e3b370ed65409814bcc3d"},"downloads":-1,"filename":"pyjwkest-0.3.0.tar.gz","has_sig":false,"md5_digest":"e5da7de4c94266b99b4c79f635d73991","packagetype":"sdist","python_version":"source","requires_python":null,"size":35970,"upload_time":"2014-03-07T08:44:35","upload_time_iso_8601":"2014-03-07T08:44:35.936721Z","url":"https://files.pythonhosted.org/packages/53/17/13eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30/pyjwkest-0.3.0.tar.gz","yanked":false,"yanked_reason":null}]}} diff --git a/tests/TestNoOSIApproved.json b/tests/TestNoOSIApproved.json new file mode 100644 index 0000000000000000000000000000000000000000..babd082924efce995aa2d73d2d1f4ec7581c36ad --- /dev/null +++ b/tests/TestNoOSIApproved.json @@ -0,0 +1 @@ +{"info":{"author":"Fabien Coelho","author_email":"flask.auth@coelho.net","bugtrack_url":null,"classifiers":["Development Status :: 5 - Production/Stable","License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication","Programming Language :: Python","Topic :: Software Development :: Libraries :: Python Modules"],"description":"","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page": "https://github.com/zx80/flask-simple-auth","keywords":"","license":"","maintainer":"","maintainer_email":"","name":"FlaskSimpleAuth","package_url":"https://pypi.org/project/FlaskSimpleAuth/","platform":"","project_url":null,"project_urls":null,"release_url":"https://pypi.org/project/pyjwkest/1.4.2/","requires_dist":null,"requires_python":"","summary":"Python implementation of JWT, JWE, JWS and JWK","version":"1.4.2","yanked":false,"yanked_reason":null},"last_serial":5455412,"releases":{"1.4.2":[{"comment_text":"","digests":{"blake2b_256":"531713eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30","md5":"e5da7de4c94266b99b4c79f635d73991","sha256":"35ace8f52d87dd4d5b108e615882d04f40eb3151cc6e3b370ed65409814bcc3d"},"downloads":-1,"filename":"pyjwkest-0.3.0.tar.gz","has_sig":false,"md5_digest":"e5da7de4c94266b99b4c79f635d73991","packagetype":"sdist","python_version":"source","requires_python":null,"size":35970,"upload_time":"2014-03-07T08:44:35","upload_time_iso_8601":"2014-03-07T08:44:35.936721Z","url":"https://files.pythonhosted.org/packages/53/17/13eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30/pyjwkest-0.3.0.tar.gz","yanked":false,"yanked_reason":null}]}} diff --git a/tests/TestOSIApproved.json b/tests/TestOSIApproved.json new file mode 100644 index 0000000000000000000000000000000000000000..15e32572c8a69d278813a11ebf4d6774beb63ac2 --- /dev/null +++ b/tests/TestOSIApproved.json @@ -0,0 +1 @@ +{"info":{"author":"Roland Hedberg","author_email":"roland@catalogix.se","bugtrack_url":null,"classifiers":["Development Status :: 4 - Beta","License :: OSI Approved :: Apache Software License","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3.5","Topic :: Software Development :: Libraries :: Python Modules"],"description":"","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page": null,"keywords":"","license":"","maintainer":"","maintainer_email":"","name":"pyjwkest","package_url":null,"platform":"","project_url":null,"project_urls":null,"release_url":"https://pypi.org/project/pyjwkest/1.4.2/","requires_dist":null,"requires_python":"","summary":"Python implementation of JWT, JWE, JWS and JWK","version":"1.4.2","yanked":false,"yanked_reason":null},"last_serial":5455412,"releases":{"1.4.2":[{"comment_text":"","digests":{"blake2b_256":"531713eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30","md5":"e5da7de4c94266b99b4c79f635d73991","sha256":"35ace8f52d87dd4d5b108e615882d04f40eb3151cc6e3b370ed65409814bcc3d"},"downloads":-1,"filename":"pyjwkest-0.3.0.tar.gz","has_sig":false,"md5_digest":"e5da7de4c94266b99b4c79f635d73991","packagetype":"sdist","python_version":"source","requires_python":null,"size":35970,"upload_time":"2014-03-07T08:44:35","upload_time_iso_8601":"2014-03-07T08:44:35.936721Z","url":"https://files.pythonhosted.org/packages/53/17/13eb3b49999171e265a8eff6415a39006c63af2ff8427d88639541605f30/pyjwkest-0.3.0.tar.gz","yanked":false,"yanked_reason":null}]}} diff --git a/tests/test_get_license.py b/tests/test_get_license.py new file mode 100644 index 0000000000000000000000000000000000000000..1227f93873c4122a2a50f52d4d3986a980af50d7 --- /dev/null +++ b/tests/test_get_license.py @@ -0,0 +1,98 @@ +import unittest +import io +import os +import urllib.request +from pathlib import Path +from unittest.mock import patch, MagicMock +from pyporter.pyporter import porter_creator + + +class TestNoOSIApproved(unittest.TestCase): + """ + case 1: json["info"]["license"] == "" and the License in json["info"]["classifiers"] is not OSI approved + """ + def setUp(self): + self.f = open(os.path.join('tests', __class__.__name__ + '.json')) + self.data = self.f.read().encode() + + @patch('urllib.request.urlopen') + def test_no_OSI_approved(self, m): + cm = MagicMock() + cm.read.return_value = self.data + cm.__enter__.return_value = cm + m.return_value = cm + + args = MagicMock() + args.configure_mock(type="python") + args.pkg = "oic" + args.pkgversion = "1.5.0" + args.arch = None + args.mirror = "" + + p = porter_creator(args) + self.assertEqual('CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', p.get_license()) + + def tearDown(self): + self.f.close() + + +class TestOSIApproved(unittest.TestCase): + """ + case 2: json["info"]["license"] == "" and the License in json["info"]["classifiers"] is OSI approved + """ + def setUp(self): + self.f = open(os.path.join('tests', __class__.__name__ + '.json')) + self.data = self.f.read().encode() + + @patch('urllib.request.urlopen') + def test_OSI_approved(self, m): + cm = MagicMock() + cm.read.return_value = self.data + cm.__enter__.return_value = cm + m.return_value = cm + + args = MagicMock() + args.configure_mock(type="python") + args.pkg = "oic" + args.pkgversion = "1.5.0" + args.arch = None + args.mirror = "" + + p = porter_creator(args) + self.assertEqual('Apache Software License', p.get_license()) + + def tearDown(self): + self.f.close() + + +class TestLicense(unittest.TestCase): + """ + case 3: json["info"]["license"] != "" + """ + def setUp(self): + self.f = open(os.path.join('tests', __class__.__name__ + '.json')) + self.data = self.f.read().encode() + + @patch('urllib.request.urlopen') + def test_OSI_approved(self, m): + cm = MagicMock() + cm.read.return_value = self.data + cm.__enter__.return_value = cm + m.return_value = cm + + args = MagicMock() + args.configure_mock(type="python") + args.pkg = "oic" + args.pkgversion = "1.5.0" + args.arch = None + args.mirror = "" + + p = porter_creator(args) + self.assertEqual('Apache 2.0', p.get_license()) + + def tearDown(self): + self.f.close() + + +if __name__ == '__main__': + unittest.main()