diff --git a/pipdeps/pipdeps.py b/pipdeps/pipdeps.py index 9fd4c15d3ff3757a859b9bb824968450639cf8ad..b42e161cdffb23f47bde48003679fec7639c71fe 100644 --- a/pipdeps/pipdeps.py +++ b/pipdeps/pipdeps.py @@ -328,53 +328,49 @@ def get_metadata(package, version): break return metadata +def metadata_version(data): + """ + Return metadata version or None + """ + version = None + for line in data: + if 'Metadata-Version' in line.decode('utf-8'): + version = line.replace('Metadata-Version:', '').strip() + break + return version + +def validate_pyver(metadata): + """ + Return True if python version satisfies + """ + if metadata is None: + return None + mversion = metadata_version(metadata) + if mversion and is_in_specifiers(mversion, ['>=2.0']): + py_ver = ", ".join([line.replace('Requires-Python:', '').strip() \ + for line in metadata if re.search(r'^Requires-Python:', line)]) + py_ver = py_ver.split(',') + if py_ver: + return is_in_specifiers(PY_VER, py_ver) + return True + def parse_metadata(metadata, extra): """ Return dependencies parsed from metadata """ if metadata is None: return None - for line in metadata: - if 'Metadata-Version' in line.decode('utf-8'): - metadata_version = line.replace('Metadata-Version:', '').strip() - break - arr = [] - if metadata_version and \ - packaging.version.Version(metadata_version) >= packaging.version.Version('2.0'): + mversion = metadata_version(metadata) + if mversion and is_in_specifiers(mversion, ['>=2.0']): arr = [] lines = [line.replace('Requires-Dist:', '').strip() \ for line in metadata if re.search(r'^Requires-Dist:', line)] for line in lines: data = pkginfo(str(line), req_extra=extra, repair=True) if data: - arr.append(pkginfo(str(line), req_extra=extra, repair=True)) + arr.append(data) return arr -def get_pkg_data(): - """ - Return package data - """ - packages_data = {} - # pylint: disable=protected-access - for pkg in pip._internal.utils.misc.get_installed_distributions(): - pkg_name, pkg_ver, _pkg_extra = pkginfo(str(pkg)) - rev = {'installed_version': pkg_ver, - 'requires': [pkginfo(str(dep), repair=True) for dep in pkg.requires()]} - packages_data[pkg_name] = rev - packages_data = insert_extras(packages_data) - packages_data = insert_availables(packages_data) - packages_data = insert_news(packages_data) - - while True: - new_packages_data = new_packages(packages_data) - if not new_packages_data: - break - new_packages_data = insert_availables(new_packages_data) - new_packages_data = insert_news(new_packages_data) - packages_data = merge_two_dicts(packages_data, new_packages_data) - check_new_extras(packages_data) - return packages_data - def pkginfo(data, req_extra=None, repair=False): """ Return parsed pkginfo @@ -418,6 +414,31 @@ def pkginfo(data, req_extra=None, repair=False): return None return (pkg_name.lower(), pkg_ver, pkg_extra) +def get_pkg_data(): + """ + Return package data + """ + packages_data = {} + # pylint: disable=protected-access + for pkg in pip._internal.utils.misc.get_installed_distributions(): + pkg_name, pkg_ver, _pkg_extra = pkginfo(str(pkg)) + rev = {'installed_version': pkg_ver, + 'requires': [pkginfo(str(dep), repair=True) for dep in pkg.requires()]} + packages_data[pkg_name] = rev + packages_data = insert_extras(packages_data) + packages_data = insert_availables(packages_data) + packages_data = insert_news(packages_data) + + while True: + new_packages_data = new_packages(packages_data) + if not new_packages_data: + break + new_packages_data = insert_availables(new_packages_data) + new_packages_data = insert_news(new_packages_data) + packages_data = merge_two_dicts(packages_data, new_packages_data) + check_new_extras(packages_data) + return packages_data + def insert_extras(data): """ Insert extras @@ -474,8 +495,8 @@ def get_available_vers(package): if requires_python: requires_python = list(set(requires_python)) if len(packagetype) == 1 and packagetype[0] == 'bdist_wheel' and len(python_version) == 1: - pyt_ver = re.search(r"^py([0-9])", python_version[0]) - if pyt_ver is not None and not is_in_specifiers(PY_VER, [">= %s" % pyt_ver.group(1)]): + py_ver = re.search(r"^py([0-9])", python_version[0]) + if py_ver is not None and not is_in_specifiers(PY_VER, [">= %s" % py_ver.group(1)]): continue if is_version(release) and is_in_specifiers(PY_VER, requires_python): versions.append(release) @@ -505,7 +526,12 @@ def insert_news(data): if new_version: res = {} for version in new_version: - content = parse_metadata(get_metadata(pkg, version), pkg_data['extras']) + metadata = get_metadata(pkg, version) + pyver_validation = validate_pyver(metadata) + if pyver_validation is not None and pyver_validation is False: + pkg_data['available_version'].remove(version) + continue + content = parse_metadata(metadata, pkg_data['extras']) if content is not None: res[version] = content if res: