예제 #1
0
 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)
예제 #3
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
예제 #4
0
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()
예제 #5
0
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()