diff --git a/pyp2rpm/archive.py b/pyp2rpm/archive.py index 2eef9a7f..e1564865 100644 --- a/pyp2rpm/archive.py +++ b/pyp2rpm/archive.py @@ -96,10 +96,6 @@ def is_tar(self): def is_egg(self): return self.suffix == '.egg' - @property - def is_wheel(self): - return self.suffix == '.whl' - def open(self): try: if self.extractor_cls == ZipFile: @@ -284,30 +280,6 @@ def top_directory(self): if self.handle: return os.path.commonprefix(self.handle.getnames()).rstrip('/') - @property - def json_wheel_metadata(self): - """Simple getter that get content of metadata.json file in .whl archive - Returns: - metadata from metadata.json or pydist.json in json format - """ - for meta_file in ("metadata.json", "pydist.json"): - try: - return json.loads(self.get_content_of_file(meta_file)) - except TypeError as err: - logger.warning( - 'Could not extract metadata from {}.' - ' Error: {}'.format(meta_file, err)) - sys.exit( - 'Unable to extract package metadata from .whl archive. ' - 'This might be caused by an old .whl format version. ' - 'You may ask the upstream to upload fresh wheels created ' - 'with wheel >= 0.17.0 or to upload an sdist as well to ' - 'workaround this problem.') - - def wheel_description(self): - """Get content of DESCRIPTION file in .whl archive""" - return self.get_content_of_file('DESCRIPTION.rst') - @property def record(self): """Getter that get content of RECORD file in .whl archive diff --git a/pyp2rpm/convertor.py b/pyp2rpm/convertor.py index 19355b4a..1094f9ac 100644 --- a/pyp2rpm/convertor.py +++ b/pyp2rpm/convertor.py @@ -253,14 +253,9 @@ def metadata_extractor(self): raise AttributeError("local_file attribute must be set before " "calling metadata_extractor") if not hasattr(self, '_metadata_extractor'): - if self.local_file.endswith('.whl'): - logger.info("Getting metadata from wheel using " - "WheelMetadataExtractor.") - extractor_cls = metadata_extractors.WheelMetadataExtractor - else: - logger.info("Getting metadata from setup.py using " - "SetupPyMetadataExtractor.") - extractor_cls = metadata_extractors.SetupPyMetadataExtractor + logger.info("Getting metadata from setup.py using " + "SetupPyMetadataExtractor.") + extractor_cls = metadata_extractors.SetupPyMetadataExtractor base_python_version = ( self.base_python_version or self.template_base_py_ver) diff --git a/pyp2rpm/metadata_extractors.py b/pyp2rpm/metadata_extractors.py index b2e242dd..3fa4301f 100644 --- a/pyp2rpm/metadata_extractors.py +++ b/pyp2rpm/metadata_extractors.py @@ -534,90 +534,3 @@ def data_from_archive(self): "sphinx", self.base_python_version)]) return archive_data - - -class WheelMetadataExtractor(LocalMetadataExtractor): - """Class to extract metadata from wheel archive""" - - @property - def json_metadata(self): - if not hasattr(self, '_json_metadata'): - self._json_metadata = self.archive.json_wheel_metadata - return self._json_metadata - - def get_requires(self, requires_types): - """Extracts requires of given types from metadata file, filter windows - specific requires. - """ - if not isinstance(requires_types, list): - requires_types = list(requires_types) - extracted_requires = [] - for requires_name in requires_types: - for requires in self.json_metadata.get(requires_name, []): - if 'win' in requires.get('environment', {}): - continue - extracted_requires.extend(requires['requires']) - return extracted_requires - - @property - def runtime_deps(self): - run_requires = self.get_requires(['run_requires', 'meta_requires']) - if 'setuptools' not in run_requires: - run_requires.append('setuptools') - return self.name_convert_deps_list(deps_from_pydit_json(run_requires)) - - @property - def build_deps(self): - build_requires = self.get_requires(['build_requires']) - if self.has_test_suite: - build_requires += self.get_requires([ - 'test_requires', 'run_requires']) - if 'setuptools' not in build_requires: - build_requires.append('setuptools') - return self.name_convert_deps_list(deps_from_pydit_json( - build_requires, runtime=False)) - - @property - def py_modules(self): - return self.archive.record.get('modules') - - @property - def scripts(self): - return self.archive.record.get('scripts', []) - - @property - def home_page(self): - urls = [url for url in self.json_metadata.get('extensions', {}) - .get('python.details', {}) - .get('project_urls', {}).values()] - if urls: - return urls[0] - - @property - @process_description - def description(self): - return self.archive.wheel_description() - - @property - def summary(self): - return self.json_metadata.get('summary', None) - - @property - def classifiers(self): - return self.json_metadata.get('classifiers', []) - - @property - def license(self): - return self.json_metadata.get('license', None) - - @property - def has_test_suite(self): - return self.has_test_files or self.json_metadata.get( - 'test_requires', False) is not False - - @property - def doc_files(self): - return (self.json_metadata.get('extensions', {}) - .get('python.details', {}) - .get('document_names', {}) - .values()) diff --git a/pyp2rpm/package_getters.py b/pyp2rpm/package_getters.py index 48531299..f841009c 100644 --- a/pyp2rpm/package_getters.py +++ b/pyp2rpm/package_getters.py @@ -22,7 +22,7 @@ logger = logger = logging.getLogger(__name__) -def get_url(client, name, version, wheel=False, hashed_format=False): +def get_url(client, name, version, hashed_format=False): """Retrieves list of package URLs using PyPI's XML-RPC. Chooses URL of prefered archive and md5_digest. """ @@ -39,29 +39,21 @@ def get_url(client, name, version, wheel=False, hashed_format=False): url = '' md5_digest = None - if not wheel: - # Prefered archive is tar.gz - if len(release_urls): - zip_url = zip_md5 = '' - for release_url in release_urls: - if release_url['url'].endswith("tar.gz"): - url = release_url['url'] - md5_digest = release_url['md5_digest'] - if release_url['url'].endswith(".zip"): - zip_url = release_url['url'] - zip_md5 = release_url['md5_digest'] - if url == '': - url = zip_url or release_urls[0]['url'] - md5_digest = zip_md5 or release_urls[0]['md5_digest'] - elif release_data: - url = release_data['download_url'] - else: - # Only wheel is acceptable + # Prefered archive is tar.gz + if len(release_urls): + zip_url = zip_md5 = '' for release_url in release_urls: - if release_url['url'].endswith("none-any.whl"): + if release_url['url'].endswith("tar.gz"): url = release_url['url'] md5_digest = release_url['md5_digest'] - break + if release_url['url'].endswith(".zip"): + zip_url = release_url['url'] + zip_md5 = release_url['md5_digest'] + if url == '': + url = zip_url or release_urls[0]['url'] + md5_digest = zip_md5 or release_urls[0]['md5_digest'] + elif release_data: + url = release_data['download_url'] if not url: raise exceptions.MissingUrlException( "Url of source archive not found.") @@ -149,7 +141,7 @@ def __init__(self, client, name, version=None, save_dir=None): 'found on PyPI.'.format(name, version)) self.save_dir_init(save_dir) - def get(self, wheel=False): + def get(self): """Downloads the package from PyPI. Returns: Full path of the downloaded file. @@ -158,14 +150,10 @@ def get(self, wheel=False): """ try: url = get_url(self.client, self.name, self.version, - wheel, hashed_format=True)[0] + hashed_format=True)[0] except exceptions.MissingUrlException as e: raise SystemExit(e) - if wheel: - self.temp_dir = tempfile.mkdtemp() - save_dir = self.temp_dir - else: - save_dir = self.save_dir + save_dir = self.save_dir save_file = '{0}/{1}'.format(save_dir, url.split('/')[-1]) request.urlretrieve(url, save_file) diff --git a/tests/test_convertor.py b/tests/test_convertor.py index c6394fb7..b4852814 100644 --- a/tests/test_convertor.py +++ b/tests/test_convertor.py @@ -5,8 +5,7 @@ from pyp2rpm.convertor import Convertor from pyp2rpm.exceptions import NoSuchPackageException -from pyp2rpm.metadata_extractors import (SetupPyMetadataExtractor, - WheelMetadataExtractor) +from pyp2rpm.metadata_extractors import SetupPyMetadataExtractor from pyp2rpm.package_getters import PypiDownloader, LocalFileGetter from pyp2rpm.package_data import PackageData @@ -37,8 +36,6 @@ def test_getter_bad_data(self, sf, expected): @pytest.mark.parametrize(('sf', 'expected'), [ ('{0}plumbum-0.9.0.tar.gz'.format(td_dir), SetupPyMetadataExtractor), - ('{0}setuptools-19.6-py2.py3-none-any.whl'.format(td_dir), - WheelMetadataExtractor) ]) def test_get_metadata_extractor(self, sf, expected): c = Convertor(package=sf) diff --git a/tests/test_data/py2exe-0.9.2.2-py33.py34-none-any.whl b/tests/test_data/py2exe-0.9.2.2-py33.py34-none-any.whl deleted file mode 100644 index fc175eb7..00000000 Binary files a/tests/test_data/py2exe-0.9.2.2-py33.py34-none-any.whl and /dev/null differ diff --git a/tests/test_data/setuptools-19.6-py2.py3-none-any.whl b/tests/test_data/setuptools-19.6-py2.py3-none-any.whl deleted file mode 100644 index 2efa3164..00000000 Binary files a/tests/test_data/setuptools-19.6-py2.py3-none-any.whl and /dev/null differ diff --git a/tests/test_metadata_extractors.py b/tests/test_metadata_extractors.py index 60764c1e..e2404b71 100644 --- a/tests/test_metadata_extractors.py +++ b/tests/test_metadata_extractors.py @@ -350,75 +350,3 @@ def test_doc_files(self, doc_files, license, other): data = self.e[0].extract_data() assert data.data['doc_license'] == license assert data.data['doc_files'] == other - - -class TestWheelMetadataExtractor(object): - td_dir = '{0}/test_data/'.format(tests_dir) - - def setup_method(self, method): - self.nc = NameConvertor('fedora') - self.e = [] - for archive, name, version in [ - ('setuptools-19.6-py2.py3-none-any.whl', - 'setuptools', '19.6.2'), - ('py2exe-0.9.2.2-py33.py34-none-any.whl', - 'py2exe', '0.9.2.2')]: - self.e.append(me.WheelMetadataExtractor('{0}{1}'.format( - self.td_dir, archive), name, self.nc, version, venv=False)) - - @pytest.mark.parametrize(('i', 'what', 'expected'), [ - (0, 'runtime_deps', [['Requires', 'python-certifi', '==', '2015.11.20'], - ['Requires', 'python-setuptools']]), - (0, 'build_deps', [['BuildRequires', 'python2-devel'], - ['BuildRequires', 'python-pytest', '>=', '2.8'], - ['BuildRequires', 'python-setuptools[ssl]'], - ['BuildRequires', 'python-certifi', '==', - '2015.11.20'], - ['BuildRequires', 'python-setuptools']]), - - (0, 'py_modules', ['_markerlib', 'pkg_resources', 'setuptools']), - (0, 'packages', ['setuptools']), - (0, 'scripts', []), - (0, 'home_page', 'https://bitbucket.org/pypa/setuptools'), - (0, 'summary', 'Easily download, build, install, upgrade, and uninstall Python packages'), - (0, 'license', 'TODO:'), - (0, 'has_pth', False), - (0, 'has_extension', False), - (0, 'has_test_suite', True), - (0, 'doc_files', ['DESCRIPTION.rst']), - (0, 'doc_license', []), - (0, 'sphinx_dir', None), - (0, 'python_versions', ['2', '3']), - (1, 'runtime_deps', [['Requires', 'python-setuptools']]), - (1, 'build_deps', [['BuildRequires', 'python2-devel'], - ['BuildRequires', 'python-setuptools']]), - (1, 'py_modules', ['py2exe']), - (1, 'packages', ['py2exe']), - (1, 'scripts', ['build_exe-script.py', 'build_exe.exe']), - (1, 'home_page', 'TODO:'), - (1, 'summary', 'Build standalone executables for Windows (python 3 version)'), - (1, 'license', 'MIT/X11'), - (1, 'has_pth', False), - (1, 'has_extension', False), - (1, 'has_test_suite', False), - (1, 'doc_files', []), - (1, 'doc_license', []), - (1, 'sphinx_dir', None), - (1, 'python_versions', ['3']), - - ]) - def test_extract(self, i, what, expected): - data = self.e[i].extract_data() - assert getattr(data, what) == expected - - @pytest.mark.parametrize(("input", "expected"), [ - ([], ""), - (['License :: OSI Approved :: Python Software Foundation License'], - 'Python'), - (['Classifier: License :: OSI Approved :: Python Software Foundation License'], - 'Python'), - (['License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)', - 'License :: OSI Approved :: MIT License'], 'GPLv2+ and MIT'), - ]) - def test_license_from_trove(self, input, expected): - assert me.license_from_trove(input) == expected diff --git a/tests/test_package_getters.py b/tests/test_package_getters.py index 2a4e64d3..da98211d 100644 --- a/tests/test_package_getters.py +++ b/tests/test_package_getters.py @@ -21,38 +21,35 @@ class TestPackageGetters(object): client = xmlrpclib.ServerProxy(settings.PYPI_URL) - @pytest.mark.parametrize(('name', 'version', 'wheel', 'hf', 'expected_url', 'expected_md5'), [ - ('setuptools', '18.3.1', False, False, + @pytest.mark.parametrize(('name', 'version', 'hf', 'expected_url', 'expected_md5'), [ + ('setuptools', '18.3.1', False, 'https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-18.3.1.tar.gz', '748187b93152fa60287dfb896837fd7c'), - ('setuptools', '18.3.1', True, False, - 'https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-18.3.1-py2.py3-none-any.whl', - 'a21a4d02d0bab2eac499cca72faeb076'), - ('setuptools', '18.3.1', False, True, + ('setuptools', '18.3.1', True, 'https://files.pythonhosted.org/packages/86/8a/c4666b05c74e840eb9b09d28f4e7ae76fc9075e8c653d0eb4d265a5b49d9/setuptools-18.3.1.tar.gz', '748187b93152fa60287dfb896837fd7c'), - ('pypandoc', '1.1.3', False, False, + ('pypandoc', '1.1.3', False, 'https://files.pythonhosted.org/packages/source/p/pypandoc/pypandoc-1.1.3.zip', '771f376bf9c936a90159cd94235998c2'), ]) @pytest.mark.webtest - def test_get_url(self, name, version, wheel, hf, + def test_get_url(self, name, version, hf, expected_url, expected_md5): assert (expected_url, expected_md5) == get_url( - self.client, name, version, wheel, hf) + self.client, name, version, hf) - @pytest.mark.parametrize(('name', 'version', 'wheel', 'hf', + @pytest.mark.parametrize(('name', 'version', 'hf', 'exception', 'error_msg'), [ - ('nonexistent_pkg', '0.0.0', False, False, MissingUrlException, + ('nonexistent_pkg', '0.0.0', False, MissingUrlException, 'Url of source archive not found.'), - ('Pymacs', '0.25', False, False, MissingUrlException, + ('Pymacs', '0.25', False, MissingUrlException, 'Pymacs package has no sources on PyPI, Please ask the maintainer to upload sources.'), ]) @pytest.mark.webtest - def test_get_url_raises(self, name, version, wheel, hf, + def test_get_url_raises(self, name, version, hf, exception, error_msg): with pytest.raises(exception) as exc_info: - get_url(self.client, name, version, wheel, hf) + get_url(self.client, name, version, hf) assert error_msg == str(exc_info.value) @@ -90,12 +87,6 @@ def setup_method(self, method): self.td_dir)), LocalFileGetter('{0}unextractable-1.tar'.format( self.td_dir)), - LocalFileGetter( - '{0}setuptools-19.6-py2.py3-none-any.whl'.format( - self.td_dir)), - LocalFileGetter( - '{0}py2exe-0.9.2.2-py33.py34-none-any.whl'.format( - self.td_dir)), LocalFileGetter('python-foo-1.tar'), LocalFileGetter('python-many-dashes-foo-1.tar'), ] @@ -109,8 +100,6 @@ def teardown_method(self, method): (0, 'plumbum-0.9.0'), (1, 'Sphinx-1.1.3-py2.6'), (2, 'unextractable-1'), - (3, 'setuptools-19.6-py2.py3-none-any'), - (4, 'py2exe-0.9.2.2-py33.py34-none-any'), ]) def test_stripped_name_version(self, i, expected): assert self.l[i]._stripped_name_version == expected @@ -118,10 +107,8 @@ def test_stripped_name_version(self, i, expected): @pytest.mark.parametrize(('i', 'expected'), [ (0, ('plumbum', '0.9.0')), (1, ('Sphinx', '1.1.3')), - (3, ('setuptools', '19.6')), - (4, ('py2exe', '0.9.2.2')), - (5, ('python-foo', '1')), - (6, ('python-many-dashes-foo', '1')), + (3, ('python-foo', '1')), + (4, ('python-many-dashes-foo', '1')), ]) def test_get_name_version(self, i, expected): assert self.l[i].get_name_version() == expected