in azdev/operations/pypi.py [0:0]
def _compare_module_against_pypi(results, root_dir, mod, mod_path):
import zipfile
version_pattern = re.compile(r'.*azure_cli[^-]*-(\d*.\d*.\d*).*')
downloaded_path = None
downloaded_version = None
build_path = None
build_version = None
build_dir = os.path.join(root_dir, mod, 'local')
pypi_dir = os.path.join(root_dir, mod, 'public')
# download the public PyPI package and extract the version
logger.info('Checking %s...', mod)
result = pip_cmd('download {} --no-deps -d {}'.format(mod, root_dir)).result
try:
result = result.decode('utf-8')
except AttributeError:
pass
for line in result.splitlines():
line = line.strip()
if line.endswith('.whl') and line.startswith('Saved'):
downloaded_path = line.replace('Saved ', '').strip()
downloaded_version = version_pattern.match(downloaded_path).group(1)
break
if 'No matching distribution found' in line:
downloaded_path = None
downloaded_version = 'Unavailable'
break
if not downloaded_version:
raise CLIError('Unexpected error trying to acquire {}: {}'.format(mod, result))
# build from source and extract the version
setup_path = os.path.normpath(mod_path.strip())
os.chdir(setup_path)
py_cmd('setup.py bdist_wheel -d {}'.format(build_dir))
if len(os.listdir(build_dir)) != 1:
raise CLIError('Unexpectedly found multiple build files found in {}.'.format(build_dir))
build_path = os.path.join(build_dir, os.listdir(build_dir)[0])
build_version = version_pattern.match(build_path).group(1)
results[mod].update({
'local_version': build_version,
'public_version': downloaded_version
})
# OK if package is new
if downloaded_version == 'Unavailable':
results[mod]['status'] = 'OK'
return results
# OK if local version is higher than what's on PyPI
from distutils.version import LooseVersion # pylint:disable=import-error,no-name-in-module,deprecated-module
if LooseVersion(build_version) > LooseVersion(downloaded_version):
results[mod]['status'] = 'OK'
return results
# slight difference in dist-info dirs, so we must extract the azure folders and compare them
with zipfile.ZipFile(str(downloaded_path), 'r') as z:
z.extractall(pypi_dir)
with zipfile.ZipFile(str(build_path), 'r') as z:
z.extractall(build_dir)
errors = _compare_folders(os.path.join(pypi_dir), os.path.join(build_dir))
# clean up empty strings
errors = [e for e in errors if e]
if errors:
subheading('Differences found in {}'.format(mod))
for error in errors:
logger.warning(error)
results[mod]['status'] = 'OK' if not errors else 'BUMP'
# special case: to make a release, these MUST be bumped, even if it wouldn't otherwise be necessary
if mod in ['azure-cli', 'azure-cli-core']:
if results[mod]['status'] == 'OK':
logger.warning('%s version must be bumped to support release!', mod)
results[mod]['status'] = 'BUMP'
return results