def _get_extension_info_from_source(source): url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) # Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this. extension_name = parsed_filename.groupdict().get('name').replace('_', '-') if parsed_filename else None extension_version = parsed_filename.groupdict().get('ver') if parsed_filename else None return extension_name, extension_version
def _is_not_platform_specific(item): parsed_filename = WHEEL_INFO_RE(item['filename']) p = parsed_filename.groupdict() if p.get('abi') == 'none' and p.get('plat') == 'any': return True logger.debug("Skipping '%s' as not universal wheel." "We do not currently support platform specific extension detection. " "They can be installed with the full URL %s", item['filename'], item.get('downloadUrl')) return False
def _is_not_platform_specific(item): parsed_filename = WHEEL_INFO_RE(item['filename']) p = parsed_filename.groupdict() if p.get('pyver') == 'py2.py3' and p.get('abi') == 'none' and p.get('plat') == 'any': return True logger.debug("Skipping '%s' as not universal wheel." "We do not currently support platform specific extension detection. " "They can be installed with the full URL %s", item['filename'], item.get('downloadUrl')) return False
def _add_whl_ext(cli_ctx, source, ext_sha256=None, pip_extra_index_urls=None, pip_proxy=None, system=None): # pylint: disable=too-many-statements cli_ctx.get_progress_controller().add(message='Analyzing') if not source.endswith('.whl'): raise ValueError( 'Unknown extension type. Only Python wheels are supported.') url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename( url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) # Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this. extension_name = parsed_filename.groupdict().get('name').replace( '_', '-') if parsed_filename else None if not extension_name: raise CLIError( 'Unable to determine extension name from {}. Is the file name correct?' .format(source)) if extension_exists(extension_name, ext_type=WheelExtension): raise CLIError( 'The extension {} already exists.'.format(extension_name)) if extension_name == 'rdbms-connect': _install_deps_for_psycopg2() ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) import requests try: cli_ctx.get_progress_controller().add(message='Downloading') _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError( 'Please ensure you have network connection. Error detail: {}'. format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension %s', ext_file) if ext_sha256: valid_checksum, computed_checksum = is_valid_sha256sum( ext_file, ext_sha256) if valid_checksum: logger.debug("Checksum of %s is OK", ext_file) else: logger.debug( "Invalid checksum for %s. Expected '%s', computed '%s'.", ext_file, ext_sha256, computed_checksum) raise CLIError( "The checksum of the extension does not match the expected value. " "Use --debug for more information.") try: cli_ctx.get_progress_controller().add(message='Validating') _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError( 'The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on %s', ext_file) # Check for distro consistency check_distro_consistency() cli_ctx.get_progress_controller().add(message='Installing') # Install with pip extension_path = build_extension_path(extension_name, system) pip_args = ['install', '--target', extension_path, ext_file] if pip_proxy: pip_args = pip_args + ['--proxy', pip_proxy] if pip_extra_index_urls: for extra_index_url in pip_extra_index_urls: pip_args = pip_args + ['--extra-index-url', extra_index_url] logger.debug('Executing pip with args: %s', pip_args) with HomebrewPipPatch(): pip_status_code = _run_pip(pip_args, extension_path) if pip_status_code > 0: logger.debug( 'Pip failed so deleting anything we might have installed at %s', extension_path) rmtree_with_retry(extension_path) raise CLIError( 'An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst) return extension_name
def _add_whl_ext(cmd, source, ext_sha256=None, pip_extra_index_urls=None, pip_proxy=None): # pylint: disable=too-many-statements cmd.cli_ctx.get_progress_controller().add(message='Analyzing') if not source.endswith('.whl'): raise ValueError('Unknown extension type. Only Python wheels are supported.') url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) # Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this. extension_name = parsed_filename.groupdict().get('name').replace('_', '-') if parsed_filename else None if not extension_name: raise CLIError('Unable to determine extension name from {}. Is the file name correct?'.format(source)) if extension_exists(extension_name, ext_type=WheelExtension): raise CLIError('The extension {} already exists.'.format(extension_name)) ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) try: cmd.cli_ctx.get_progress_controller().add(message='Downloading') _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError('Please ensure you have network connection. Error detail: {}'.format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension %s', ext_file) if ext_sha256: valid_checksum, computed_checksum = is_valid_sha256sum(ext_file, ext_sha256) if valid_checksum: logger.debug("Checksum of %s is OK", ext_file) else: logger.debug("Invalid checksum for %s. Expected '%s', computed '%s'.", ext_file, ext_sha256, computed_checksum) raise CLIError("The checksum of the extension does not match the expected value. " "Use --debug for more information.") try: cmd.cli_ctx.get_progress_controller().add(message='Validating') _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError('The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on %s', ext_file) # Check for distro consistency check_distro_consistency() cmd.cli_ctx.get_progress_controller().add(message='Installing') # Install with pip extension_path = get_extension_path(extension_name) pip_args = ['install', '--target', extension_path, ext_file] if pip_proxy: pip_args = pip_args + ['--proxy', pip_proxy] if pip_extra_index_urls: for extra_index_url in pip_extra_index_urls: pip_args = pip_args + ['--extra-index-url', extra_index_url] logger.debug('Executing pip with args: %s', pip_args) with HomebrewPipPatch(): pip_status_code = _run_pip(pip_args) if pip_status_code > 0: logger.debug('Pip failed so deleting anything we might have installed at %s', extension_path) shutil.rmtree(extension_path, ignore_errors=True) raise CLIError('An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst)