Skip to content
Snippets Groups Projects
Commit bc3eb0ce authored by Marek Chrastina's avatar Marek Chrastina
Browse files

Fix requires-python

parent c9326b03
Branches
Tags
No related merge requests found
Pipeline #13064 failed
......@@ -328,53 +328,50 @@ 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 +415,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 +496,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 +527,13 @@ 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)
val_pyver = validate_pyver(metadata)
if not val_pyver:
del pkg_data['available_version'][version]
del pkg_data['new_version'][version]
continue
content = parse_metadata(metadata, pkg_data['extras'])
if content is not None:
res[version] = content
if res:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment