Example #1
0
def validate_same_registry(left: str, right: str) -> None:
    left_uri = parse_registry_uri(left)
    right_uri = parse_registry_uri(right)
    if (not is_same_address(left_uri.address, right_uri.address)
            or left_uri.chain_id != right_uri.chain_id  # noqa: W503
        ):
        raise ValidationError(
            f"Registry URI: {left} does not match the registry found on URI: {right}."
        )
Example #2
0
def test_parse_registry_uri(uri, expected):
    address, chain_id, pkg_name, pkg_version, namespaced_asset, ens = parse_registry_uri(uri)
    assert address == expected[0]
    assert chain_id == expected[1]
    assert pkg_name == expected[2]
    assert pkg_version == expected[3]
    assert namespaced_asset == expected[4]
Example #3
0
def generate_registry_store_data(registry_uri: URI,
                                 alias: Optional[str],
                                 activate: bool = False) -> Dict[str, Any]:
    parsed_uri = parse_registry_uri(registry_uri)
    # todo: support ens in registry uri
    return {
        "ens": None,
        "address": parsed_uri.address,
        "alias": alias,
        "active": activate,
    }
def test_registry_uri_supports_ens_domains(backend):
    valid_uri = "erc1319://defi.snakecharmers.eth:1/[email protected]"
    parsed = parse_registry_uri(valid_uri)
    expected_uri = 'ipfs://QmYvsyuxjj9mKmCvn3jrdfnaHYwFsyHXUu7kETrN4dBhE6'
    assert backend.can_translate_uri(valid_uri) is True
    assert backend.can_resolve_uri(valid_uri) is False
    assert backend.fetch_uri_contents(valid_uri) == expected_uri
    assert parsed.address == "0xA635F17288187daE5b424D343E21FF44a79ce922"
    assert parsed.ens == "defi.snakecharmers.eth"
    assert parsed.chain_id == '1'
    assert parsed.name == "compound"
    assert parsed.version == "1.0.0"
Example #5
0
def resolve_install_uri(args: Namespace) -> ResolvedInstallURI:
    registry_backend = RegistryURIBackend()
    etherscan_backend = EtherscanURIBackend()
    if etherscan_backend.can_translate_uri(args.uri):
        manifest_uri = etherscan_backend.fetch_uri_contents(
            args.uri, args.package_name, args.package_version)
        registry_address = None
    elif registry_backend.can_translate_uri(args.uri):
        registry_address, _, _, _, _, _ = parse_registry_uri(args.uri)
        manifest_uri = registry_backend.fetch_uri_contents(args.uri)
    else:
        manifest_uri = args.uri
        registry_address = None
    return ResolvedInstallURI(manifest_uri, registry_address)
Example #6
0
def release_package(package_name: str, version: str, manifest_uri: URI,
                    config: Config) -> bytes:
    if not config.private_key:
        raise AuthorizationError(
            "To release a package you must provide the password for your local keyfile."
        )

    registry_store_path = config.xdg_ethpmcli_root / REGISTRY_STORE
    active_registry = get_active_registry(registry_store_path)
    parsed_uri = parse_registry_uri(active_registry.uri)
    if config.w3.net.version != parsed_uri.chain_id:
        w3 = setup_w3(to_int(text=parsed_uri.chain_id), config.private_key)
    else:
        w3 = config.w3
    w3.pm.set_registry(parsed_uri.address)
    release_id = w3.pm.release_package(package_name, version, manifest_uri)
    return release_id
Example #7
0
def test_parse_registry_uri(uri, expected):
    address, pkg_name, pkg_version = parse_registry_uri(uri)
    assert address == expected[0]
    assert pkg_name == expected[1]
    assert pkg_version == expected[2]
Example #8
0
def test_invalid_registry_uris(uri):
    with pytest.raises(EthPMValidationError):
        parse_registry_uri(uri)
Example #9
0
def update_package(args: Namespace, config: Config) -> None:
    if not is_package_installed(args.package, config):
        check_for_aliased_package(args.package, config)
        return

    installed_package = resolve_installed_package_by_id(args.package, config)
    active_registry = get_active_registry(config.xdg_ethpmcli_root /
                                          REGISTRY_STORE)
    if is_valid_registry_uri(installed_package.install_uri):
        validate_same_registry(installed_package.install_uri,
                               active_registry.uri)

    connected_chain_id = config.w3.eth.chainId
    active_registry_uri = parse_registry_uri(active_registry.uri)
    if not to_int(text=active_registry_uri.chain_id) == connected_chain_id:
        raise InstallError(
            f"Registry URI chain: {active_registry_uri.chain_id} doesn't match "
            f"connected web3: {connected_chain_id}.")

    config.w3.pm.set_registry(active_registry_uri.address)
    all_package_names = config.w3.pm.get_all_package_names()
    if installed_package.resolved_package_name not in all_package_names:
        raise InstallError(
            f"{installed_package.resolved_package_name} is not available on the active registry "
            f"{active_registry.uri}. Available packages include: {all_package_names}."
        )

    all_release_data = config.w3.pm.get_all_package_releases(
        installed_package.resolved_package_name)
    all_versions = [version for version, _ in all_release_data]

    if installed_package.resolved_version not in all_versions:
        raise InstallError(
            f"{installed_package.resolved_package_name}@{installed_package.resolved_version} not "
            f"found on the active registry {active_registry.uri}.")

    on_chain_install_uri = pluck_release_data(
        all_release_data, installed_package.resolved_version)
    if on_chain_install_uri != installed_package.resolved_uri:
        raise InstallError(
            f"Install URI found on active registry for {installed_package.resolved_package_name}@"
            f"{installed_package.resolved_version}: {on_chain_install_uri} does not match the "
            f"install URI found in local lockfile: {installed_package.resolved_uri}."
        )

    cli_logger.info(
        f"{len(all_versions)} versions of {installed_package.resolved_package_name} "
        f"found: {all_versions} \n"
        f"On the active registry: {active_registry.uri}")
    count = 0
    while True:
        count += 1
        target_version = input(
            "Please enter the version you want to install. ")
        if count > 5:
            raise InstallError("Max attempts (5) reached. ")
        elif target_version == installed_package.resolved_version:
            cli_logger.info(f"Version already installed: {target_version}. ")
        elif target_version not in all_versions:
            cli_logger.info(f"Version unavailable: {target_version}. ")
        else:
            break

    # Create an updated args/Package for new install
    updated_args = copy.deepcopy(args)
    if installed_package.resolved_package_name != args.package:
        updated_args.alias = args.package
    updated_args.uri = pluck_release_data(all_release_data, target_version)
    updated_args.package_version = target_version
    updated_package = Package(updated_args, config.ipfs_backend)

    # atomic replace
    with tempfile.TemporaryDirectory() as tmpdir:
        tmp_ethpm_dir = Path(tmpdir) / ETHPM_PACKAGES_DIR
        shutil.copytree(config.ethpm_dir, tmp_ethpm_dir)
        tmp_config = copy.copy(config)
        tmp_config.ethpm_dir = tmp_ethpm_dir
        uninstall_package(args.package, tmp_config)
        install_package(updated_package, tmp_config)
        shutil.rmtree(config.ethpm_dir)
        tmp_ethpm_dir.replace(config.ethpm_dir)

    cli_logger.info(f"{updated_args.package} successfully updated to version "
                    f"{updated_args.package_version}.")