def test_wheel_user_system_same_extension(self): _install_test_extension1() _install_test_extension1(system=True) self.assertNotEqual(build_extension_path(EXT_NAME), build_extension_path(EXT_NAME, system=True)) actual = get_extension(EXT_NAME, ext_type=WheelExtension) self.assertEqual(actual.name, EXT_NAME) self.assertEqual(actual.path, build_extension_path(EXT_NAME)) shutil.rmtree(self.ext_dir) actual = get_extension(EXT_NAME, ext_type=WheelExtension) self.assertEqual(actual.name, EXT_NAME) self.assertEqual(actual.path, build_extension_path(EXT_NAME, system=True))
def test_add_list_show_remove_user_system_extensions(self): add_extension(cmd=self.cmd, source=MY_EXT_SOURCE) add_extension(cmd=self.cmd, source=MY_SECOND_EXT_SOURCE_DASHES, system=True) actual = list_extensions() self.assertEqual(len(actual), 2) ext = show_extension(MY_EXT_NAME) self.assertEqual(ext[OUT_KEY_NAME], MY_EXT_NAME) self.assertEqual(ext[OUT_KEY_PATH], build_extension_path(MY_EXT_NAME)) second_ext = show_extension(MY_SECOND_EXT_NAME_DASHES) self.assertEqual(second_ext[OUT_KEY_NAME], MY_SECOND_EXT_NAME_DASHES) self.assertEqual( second_ext[OUT_KEY_PATH], build_extension_path(MY_SECOND_EXT_NAME_DASHES, system=True)) remove_extension(MY_EXT_NAME) num_exts = len(list_extensions()) self.assertEqual(num_exts, 1) remove_extension(MY_SECOND_EXT_NAME_DASHES) num_exts = len(list_extensions()) self.assertEqual(num_exts, 0)
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 _install_test_extension3(system=None): # pylint: disable=no-self-use # We extract the extension into place as we aren't testing install here zip_file = _get_test_data_file('{}.zip'.format(SECOND_EXT_NAME)) zip_ref = zipfile.ZipFile(zip_file, 'r') zip_ref.extractall(build_extension_path(SECOND_EXT_NAME, system=system)) zip_ref.close()
def _install_test_extension2(system=None): # pylint: disable=no-self-use # We extract the extension into place as we aren't testing install here zip_file = _get_test_data_file('myfirstcliextension_az_extmetadata.zip') zip_ref = zipfile.ZipFile(zip_file, 'r') zip_ref.extractall(build_extension_path(EXT_NAME, system=system)) zip_ref.close()