From cc759152123c1419add838695b99a205e2ac8c9d Mon Sep 17 00:00:00 2001 From: fuxinji9527 <1992666531@qq.com> Date: Fri, 11 Oct 2024 15:13:46 +0800 Subject: [PATCH] fix source0 and License are empty,modify transform_module_name method regexp --- pyporter/pyporter.py | 78 ++++++- pyporter/utils.py | 2 +- tests/TestNoLicense.json | 342 ++++++++++++++++++++++++++++ tests/test_get_license.py | 27 +++ tests/test_transform_module_name.py | 6 +- 5 files changed, 448 insertions(+), 7 deletions(-) create mode 100644 tests/TestNoLicense.json diff --git a/pyporter/pyporter.py b/pyporter/pyporter.py index 2751ddf..fe3fbb0 100755 --- a/pyporter/pyporter.py +++ b/pyporter/pyporter.py @@ -28,6 +28,7 @@ import subprocess import sys import urllib import urllib.request +import urllib.error from os import path from pathlib import Path @@ -97,7 +98,7 @@ class PyPorter: ver = "latest" url = self.__url_template.format(pkg_name=pkg) else: - url = self.__url_template_with_ver\ + url = self.__url_template_with_ver \ .format(pkg_name=pkg, pkg_ver=ver) try: @@ -175,7 +176,7 @@ class PyPorter: if k.startswith("License"): ks = k.split("::") return ks[-1].strip() - return "" + return "UNKNOWN" def get_source_info(self): """ @@ -188,8 +189,18 @@ class PyPorter: return { "filename": r["filename"], "md5": r["md5_digest"], - "url": r["url"] + "url": r["url"], + "packagetype": r["packagetype"] } + else: + for r in rs: + if r["packagetype"] == "bdist_wheel": + return { + "filename": r["filename"], + "md5": r["md5_digest"], + "url": r["url"], + "packagetype": r["packagetype"] + } return None def get_releases(self): @@ -306,6 +317,7 @@ class PyPorter: print(buildreq_tag_template.format(req='python3-devel')) print(buildreq_tag_template.format(req='python3-setuptools')) print(buildreq_tag_template.format(req='python3-pip')) + print(buildreq_tag_template.format(req='python3-wheel')) if not self.__build_noarch: print(buildreq_tag_template.format(req='python3-cffi')) print(buildreq_tag_template.format(req='gcc')) @@ -349,7 +361,7 @@ def download_source(porter, tgtpath): if s_info is None: print("Analyze source info error") return False - s_url = s_info.get("url") + s_url = porter.get_source_url() s_path = os.path.join(tgtpath, s_info.get("filename")) if os.path.exists(s_path): with open(s_path, 'rb') as f: @@ -463,6 +475,62 @@ def build_rpm(porter, rootpath): def build_spec(porter, output): + if porter.get_source_info().get("packagetype") == "sdist": + return build_sdist_spec(porter, output) + else: + return build_bdist_wheel_spec(porter, output) + + +def build_bdist_wheel_spec(porter, output): + """ + print out the spec file + """ + if os.path.isdir(output): + output = os.path.join(output, porter.get_spec_name() + ".spec") + tmp = sys.stdout + if output != "": + sys.stdout = open(output, 'w+', encoding='utf-8') + print(name_tag_template.format(pkg_name=porter.get_spec_name())) + print(version_tag_template.format(pkg_ver=porter.get_version())) + print('Release:\t1%{?dist}') + print(summary_tag_template.format(pkg_sum=porter.get_summary())) + print(license_tag_template.format(pkg_lic=porter.get_license())) + print(home_tag_template.format(pkg_home=porter.get_home())) + print(source_tag_template.format(pkg_source=porter.get_source_url())) + print("") + porter.get_buildarch() + print("") + print(f"Provides:\t{porter.get_spec_name()}") + porter.prepare_build_requires() + print("") + print("%description") + print(porter.get_description()) + print("") + print("%prep") + print("%setup -q -c -T") + print("unzip -q %{SOURCE0} -d %{_builddir}/%{name}-%{version}") + print("") + print("%build") + print("# No build step required") + print("") + print("%install") + print("mkdir -p %{buildroot}%{python3_sitelib}") + print("cp -r %{_builddir}/%{name}-%{version}/* %{buildroot}%{python3_sitelib}") + print("") + print("%files") + print("%doc") + print("%{python3_sitelib}/*") + print("") + print("%changelog") + date_str = datetime.date.today().strftime("%a %b %d %Y") + print( + f"* {date_str} Python_Bot - {porter.get_version()}-1" + ) + print("- Package Spec generated") + sys.stdout = tmp + + +def build_sdist_spec(porter, output): """ print out the spec file """ @@ -596,7 +664,7 @@ def do_args(dft_root_path): "-m", "--mirror", help="Specify pypi mirror, should be a url which contain" - " pypi packages", + " pypi packages", type=str, default="") parser.add_argument("-s", diff --git a/pyporter/utils.py b/pyporter/utils.py index 932e297..5dead7d 100644 --- a/pyporter/utils.py +++ b/pyporter/utils.py @@ -3,7 +3,7 @@ import re # TODO: this should be more compatible for https://peps.python.org/pep-0508/ def transform_module_name(input_str): - match = re.match(r"([a-zA-Z0-9_-]+)", input_str) + match = re.match(r"([a-zA-Z0-9_\-\[\]]+)", input_str) if match: module_name = match.group(1).strip() diff --git a/tests/TestNoLicense.json b/tests/TestNoLicense.json new file mode 100644 index 0000000..f848da0 --- /dev/null +++ b/tests/TestNoLicense.json @@ -0,0 +1,342 @@ +{ + "info": { + "author": "Jeff Buttars", + "author_email": "jeffbuttars@gmail.com", + "bugtrack_url": null, + "classifiers": [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9" + ], + "description": "", + "description_content_type": "", + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "", + "keywords": "", + "license": "", + "maintainer": "", + "maintainer_email": "", + "name": "cowpy", + "package_url": "https://pypi.org/project/cowpy/", + "platform": "", + "project_url": "https://pypi.org/project/cowpy/", + "project_urls": null, + "provides_extra": null, + "release_url": "https://pypi.org/project/cowpy/1.1.5/", + "requires_dist": null, + "requires_python": "\u003E=3.6", + "summary": "", + "version": "1.1.5", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 13094410, + "releases": { + "1.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "7594d43931770b5f6c9f904bcf93f46e1d2d31e0a2d4a3dfc8c6281cadbf2734", + "md5": "6849c2b173defa1b643fc299c11d5811", + "sha256": "108ffbbdeb6bac139662760c4ef4a3e54bd5f112f58ff2d00f94d7d20b6a64c7" + }, + "downloads": -1, + "filename": "cowpy-1.0.tar.gz", + "has_sig": false, + "md5_digest": "6849c2b173defa1b643fc299c11d5811", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 9080, + "upload_time": "2014-09-08T03:40:00", + "upload_time_iso_8601": "2014-09-08T03:40:00.059683Z", + "url": "https://files.pythonhosted.org/packages/75/94/d43931770b5f6c9f904bcf93f46e1d2d31e0a2d4a3dfc8c6281cadbf2734/cowpy-1.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.0.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "d316f7c7f81c310135c550876a22e2412ff45d8e2bbbf7fe26ec1b130171675c", + "md5": "24fc0f61061643097aad5f9dc6bca3e5", + "sha256": "0d0a1a6705572d16791626facd27d60a6a985483a67051fc4332294b212f730d" + }, + "downloads": -1, + "filename": "cowpy-1.0.1.tar.gz", + "has_sig": false, + "md5_digest": "24fc0f61061643097aad5f9dc6bca3e5", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 9092, + "upload_time": "2014-09-08T17:36:52", + "upload_time_iso_8601": "2014-09-08T17:36:52.600507Z", + "url": "https://files.pythonhosted.org/packages/d3/16/f7c7f81c310135c550876a22e2412ff45d8e2bbbf7fe26ec1b130171675c/cowpy-1.0.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.0.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "45ca5a2dd6793ba0494a3cbe016c8c14262b57493fde229520a1ec4b0ff5156b", + "md5": "8536eda041e566a1cae5b1e37e2d577b", + "sha256": "c9d5694b96de6467c4c9445f5537d1cf0c14c15033a8d95aef6f7cd1f409e56e" + }, + "downloads": -1, + "filename": "cowpy-1.0.2.tar.gz", + "has_sig": false, + "md5_digest": "8536eda041e566a1cae5b1e37e2d577b", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 14494, + "upload_time": "2017-10-25T21:27:35", + "upload_time_iso_8601": "2017-10-25T21:27:35.353392Z", + "url": "https://files.pythonhosted.org/packages/45/ca/5a2dd6793ba0494a3cbe016c8c14262b57493fde229520a1ec4b0ff5156b/cowpy-1.0.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.0.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "88cbb80f42e063ee9d3f241da33e20a6f849a197a634fbef31946dbaab85a5b5", + "md5": "d0ba613c6fc4e666f3b70cbcb8811679", + "sha256": "e5e5144a72a6588cad004940a60b033647d454d675b0e36ff63a9aff9c7a4583" + }, + "downloads": -1, + "filename": "cowpy-1.0.3.tar.gz", + "has_sig": false, + "md5_digest": "d0ba613c6fc4e666f3b70cbcb8811679", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 14393, + "upload_time": "2018-02-10T21:23:37", + "upload_time_iso_8601": "2018-02-10T21:23:37.331304Z", + "url": "https://files.pythonhosted.org/packages/88/cb/b80f42e063ee9d3f241da33e20a6f849a197a634fbef31946dbaab85a5b5/cowpy-1.0.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "198d5ae325c57ab40598394a98222a48e8eb4ce181c74604d7770e7fb50366f6", + "md5": "eed0543fd20bbcd4a7610552f45c9dd5", + "sha256": "1bdc61d107df02fd34a9241f2220d0704a01d8ce16bed8bff3512a34a0efa56a" + }, + "downloads": -1, + "filename": "cowpy-1.1.0.tar.gz", + "has_sig": false, + "md5_digest": "eed0543fd20bbcd4a7610552f45c9dd5", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 14886, + "upload_time": "2018-12-04T15:36:51", + "upload_time_iso_8601": "2018-12-04T15:36:51.175813Z", + "url": "https://files.pythonhosted.org/packages/19/8d/5ae325c57ab40598394a98222a48e8eb4ce181c74604d7770e7fb50366f6/cowpy-1.1.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "58606b6a7e759433fab66a4d6b39c44ff182563ace515625d6db14520bb4fc35", + "md5": "068efb88a6fc010bd3edc81b66eead05", + "sha256": "412d309684c898159c2437eaa716cf5df75f65fa157c9f6df7199c3658124cbc" + }, + "downloads": -1, + "filename": "cowpy-1.1.1.tar.gz", + "has_sig": false, + "md5_digest": "068efb88a6fc010bd3edc81b66eead05", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 15714, + "upload_time": "2021-10-13T16:35:32", + "upload_time_iso_8601": "2021-10-13T16:35:32.841108Z", + "url": "https://files.pythonhosted.org/packages/58/60/6b6a7e759433fab66a4d6b39c44ff182563ace515625d6db14520bb4fc35/cowpy-1.1.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "f109778739c8d94be1c7543a85a9d5c2c284301d4a4a442639f87da9dfcb15df", + "md5": "3726ec7e6435218ece386154f4f90ebd", + "sha256": "1af8bc32e7ac6042d8d7f175dd87aa4f6f03a3c6e68c030fa2bf82c6f544f12d" + }, + "downloads": -1, + "filename": "cowpy-1.1.2.tar.gz", + "has_sig": false, + "md5_digest": "3726ec7e6435218ece386154f4f90ebd", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 19014, + "upload_time": "2021-10-16T15:20:09", + "upload_time_iso_8601": "2021-10-16T15:20:09.431065Z", + "url": "https://files.pythonhosted.org/packages/f1/09/778739c8d94be1c7543a85a9d5c2c284301d4a4a442639f87da9dfcb15df/cowpy-1.1.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "bc5a1b0f06aadb4f75d0d462881015fee3cfb6f155cbd926f20335e085edb078", + "md5": "e8f1a2fcfeb9c0041487540cb20b4f07", + "sha256": "0d1502c07a70a1f5acf9fd7ce0a1b3320a27ab9ff5e5b6288484662245da5ec0" + }, + "downloads": -1, + "filename": "cowpy-1.1.3.tar.gz", + "has_sig": false, + "md5_digest": "e8f1a2fcfeb9c0041487540cb20b4f07", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.0", + "size": 19371, + "upload_time": "2021-12-08T15:26:43", + "upload_time_iso_8601": "2021-12-08T15:26:43.081373Z", + "url": "https://files.pythonhosted.org/packages/bc/5a/1b0f06aadb4f75d0d462881015fee3cfb6f155cbd926f20335e085edb078/cowpy-1.1.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.4": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a931081ff3835834cbc34db838019ee32e394027867c43d907de0d03f0ba36ad", + "md5": "864cb4ee2e4bf61aa921bafa45c54d29", + "sha256": "5e6fd6ff00008da7646e919ccf45892fb363ed048101afd94ebd5f7640933663" + }, + "downloads": -1, + "filename": "cowpy-1.1.4.tar.gz", + "has_sig": false, + "md5_digest": "864cb4ee2e4bf61aa921bafa45c54d29", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.0", + "size": 27107, + "upload_time": "2021-12-08T15:36:31", + "upload_time_iso_8601": "2021-12-08T15:36:31.168439Z", + "url": "https://files.pythonhosted.org/packages/a9/31/081ff3835834cbc34db838019ee32e394027867c43d907de0d03f0ba36ad/cowpy-1.1.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.5": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "29a276daec910034d765f1018d22660c0970fb99f77143a42841d067b522903e", + "md5": "23e2972e60f0ec17e96d32e07d3fa17e", + "sha256": "de5ae7646dd30b4936013666c6bd019af9cf411cc3b377c8538cfd8414262921" + }, + "downloads": -1, + "filename": "cowpy-1.1.5-py3-none-any.whl", + "has_sig": false, + "md5_digest": "23e2972e60f0ec17e96d32e07d3fa17e", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 13943, + "upload_time": "2022-03-06T18:17:37", + "upload_time_iso_8601": "2022-03-06T18:17:37.186140Z", + "url": "https://files.pythonhosted.org/packages/29/a2/76daec910034d765f1018d22660c0970fb99f77143a42841d067b522903e/cowpy-1.1.5-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6ed3bab2411dbae0c5debf103a5aadd4dfef3c68c5ccb6c4d8ac63dd2bfae889", + "md5": "d25d6eb42feec95b7047a93f502709c5", + "sha256": "089172db1d88c30a2e1b741b18945ee84170bd943a3ca71948e4ae3a3255e554" + }, + "downloads": -1, + "filename": "cowpy-1.1.5.tar.gz", + "has_sig": false, + "md5_digest": "d25d6eb42feec95b7047a93f502709c5", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 24724, + "upload_time": "2022-03-06T18:17:38", + "upload_time_iso_8601": "2022-03-06T18:17:38.926530Z", + "url": "https://files.pythonhosted.org/packages/6e/d3/bab2411dbae0c5debf103a5aadd4dfef3c68c5ccb6c4d8ac63dd2bfae889/cowpy-1.1.5.tar.gz", + "yanked": false, + "yanked_reason": null + } + ] + }, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "29a276daec910034d765f1018d22660c0970fb99f77143a42841d067b522903e", + "md5": "23e2972e60f0ec17e96d32e07d3fa17e", + "sha256": "de5ae7646dd30b4936013666c6bd019af9cf411cc3b377c8538cfd8414262921" + }, + "downloads": -1, + "filename": "cowpy-1.1.5-py3-none-any.whl", + "has_sig": false, + "md5_digest": "23e2972e60f0ec17e96d32e07d3fa17e", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 13943, + "upload_time": "2022-03-06T18:17:37", + "upload_time_iso_8601": "2022-03-06T18:17:37.186140Z", + "url": "https://files.pythonhosted.org/packages/29/a2/76daec910034d765f1018d22660c0970fb99f77143a42841d067b522903e/cowpy-1.1.5-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6ed3bab2411dbae0c5debf103a5aadd4dfef3c68c5ccb6c4d8ac63dd2bfae889", + "md5": "d25d6eb42feec95b7047a93f502709c5", + "sha256": "089172db1d88c30a2e1b741b18945ee84170bd943a3ca71948e4ae3a3255e554" + }, + "downloads": -1, + "filename": "cowpy-1.1.5.tar.gz", + "has_sig": false, + "md5_digest": "d25d6eb42feec95b7047a93f502709c5", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 24724, + "upload_time": "2022-03-06T18:17:38", + "upload_time_iso_8601": "2022-03-06T18:17:38.926530Z", + "url": "https://files.pythonhosted.org/packages/6e/d3/bab2411dbae0c5debf103a5aadd4dfef3c68c5ccb6c4d8ac63dd2bfae889/cowpy-1.1.5.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/test_get_license.py b/tests/test_get_license.py index a7e4546..b1862a1 100644 --- a/tests/test_get_license.py +++ b/tests/test_get_license.py @@ -97,5 +97,32 @@ class TestLicense(unittest.TestCase): self.f.close() +class TestNoLicense(unittest.TestCase): + """ + case 4: 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('UNKNOWN', p.get_license()) + + if __name__ == '__main__': unittest.main() diff --git a/tests/test_transform_module_name.py b/tests/test_transform_module_name.py index de53d7b..db48287 100644 --- a/tests/test_transform_module_name.py +++ b/tests/test_transform_module_name.py @@ -19,10 +19,14 @@ class TestTransofrmModuleName(unittest.TestCase): expected_output = "(python3-pyjwkest>=1.3.6)" self.assertEqual(transform_module_name(input_str), expected_output) + input_str = "ipython[all] (=3.1)" + expected_output = "(python3-ipython[all]=3.1)" + self.assertEqual(transform_module_name(input_str), expected_output) + def test_invalid_input(self): input_str = "!invalid_module123" expected_output = "Invalid input format" - self.assertEqual(transform_module_name(input_str), expected_output) + self.assertEqual(transform_module_name(input_str), expected_output) if __name__ == '__main__': -- Gitee