Ejemplo n.º 1
0
    def __init__(
            self, manifest: Dict[str, Any], w3: Web3, uri: Optional[str] = None
    ) -> None:
        """
        A package should be created using one of the available
        classmethods and a valid w3 instance.
        """
        if not isinstance(manifest, dict):
            raise TypeError(
                "Package object must be initialized with a dictionary. "
                f"Got {type(manifest)}"
            )

        if "manifest" not in manifest or manifest["manifest"] != "ethpm/3":
            raise EthPMValidationError(
                "Py-Ethpm currently only supports v3 ethpm manifests. "
                "Please use the CLI to update or re-generate a v3 manifest. "
            )

        validate_manifest_against_schema(manifest)
        validate_manifest_deployments(manifest)
        validate_w3_instance(w3)

        self.w3 = w3
        self.w3.eth.defaultContractFactory = cast(Type[Contract], LinkableContract)
        self.manifest = manifest
        self._uri = uri
Ejemplo n.º 2
0
    def release_package(self, package_name: str, version: str,
                        manifest_uri: str) -> bytes:
        """
        Returns the release id generated by releasing a package on the current registry.
        Requires ``web3.PM`` to have a registry set. Requires ``web3.eth.defaultAccount``
        to be the registry owner.

        * Parameters:
            * ``package_name``: Must be a valid package name, matching the given manifest.
            * ``version``: Must be a valid package version, matching the given manifest.
            * ``manifest_uri``: Must be a valid content-addressed URI. Currently, only IPFS
              and Github content-addressed URIs are supported.

        """
        validate_is_supported_manifest_uri(manifest_uri)
        raw_manifest = to_text(resolve_uri_contents(manifest_uri))
        validate_raw_manifest_format(raw_manifest)
        manifest = json.loads(raw_manifest)
        validate_manifest_against_schema(manifest)
        if package_name != manifest["package_name"]:
            raise ManifestValidationError(
                f"Provided package name: {package_name} does not match the package name "
                f"found in the manifest: {manifest['package_name']}.")

        if version != manifest["version"]:
            raise ManifestValidationError(
                f"Provided package version: {version} does not match the package version "
                f"found in the manifest: {manifest['version']}.")

        self._validate_set_registry()
        return self.registry._release(package_name, version, manifest_uri)
Ejemplo n.º 3
0
def process_and_validate_raw_manifest(raw_manifest: bytes) -> Manifest:
    raw_manifest_text = to_text(raw_manifest).rstrip("\n")
    validate_raw_manifest_format(raw_manifest_text)
    manifest = json.loads(raw_manifest_text)
    validate_manifest_against_schema(manifest)
    validate_manifest_deployments(manifest)
    return manifest
Ejemplo n.º 4
0
def pin_local_manifest(manifest_path: Path) -> Tuple[str, str, URI]:
    manifest_output = json.loads(manifest_path.read_text())
    validate_manifest_against_schema(manifest_output)
    package_name = manifest_output["package_name"]
    package_version = manifest_output["version"]

    ipfs_backend = get_ipfs_backend()
    ipfs_data = ipfs_backend.pin_assets(manifest_path)

    manifest_uri = URI(f"ipfs://{ipfs_data[0]['Hash']}")
    return (package_name, package_version, manifest_uri)
Ejemplo n.º 5
0
    def __init__(self,
                 manifest: Dict[str, Any],
                 w3: Web3,
                 uri: Optional[str] = None) -> None:
        """
        A package should be created using one of the available
        classmethods and a valid w3 instance.
        """
        if not isinstance(manifest, dict):
            raise TypeError(
                "Package object must be initialized with a dictionary. "
                f"Got {type(manifest)}")

        validate_manifest_against_schema(manifest)
        validate_manifest_deployments(manifest)
        validate_w3_instance(w3)

        self.w3 = w3
        self.w3.eth.defaultContractFactory = LinkableContract
        self.manifest = manifest
        self._uri = uri
Ejemplo n.º 6
0
def amend_manifest(manifest_path: Path) -> None:
    cli_logger.info(f"{bold_blue('Manifest Wizard')}")
    cli_logger.info("---------------")
    cli_logger.info("Amend a local manifest.")
    cli_logger.info("")

    manifest = json.loads(manifest_path.read_text())
    validate_manifest_against_schema(manifest)
    pkg_repr = f"<Package {manifest['package_name']}=={manifest['version']}>"
    cli_logger.info(f"Valid manifest for {pkg_repr} found at {manifest_path}.")
    builder_fns = (
        amend_description(manifest),
        amend_license(manifest),
        amend_authors(manifest),
        amend_keywords(manifest),
        amend_links(manifest),
        *amend_deployments(manifest),
        gen_validate_manifest(),
    )
    final_fns = (fn for fn in builder_fns if fn is not None)
    amended_manifest = b.build(manifest, *final_fns)
    write_manifest_to_disk(amended_manifest, manifest_path.parent)
Ejemplo n.º 7
0
def validate(manifest: Manifest) -> Manifest:
    """
    Return a validated manifest against the V2-specification schema.
    """
    validate_manifest_against_schema(manifest)
    return manifest
Ejemplo n.º 8
0
def test_validate_manifest_invalidates(invalid_manifest):
    with pytest.raises(ValidationError):
        validate_manifest_against_schema(invalid_manifest)
Ejemplo n.º 9
0
def test_validate_manifest_against_all_manifest_types(all_manifests):
    assert validate_manifest_against_schema(all_manifests) is None
def test_manifest_assets_are_valid(manifest):
    result = validate_manifest_against_schema(manifest)
    assert result is None
Ejemplo n.º 11
0
def test_validate_manifest_invalidates(invalid_manifest):
    with pytest.raises(EthPMValidationError,
                       match="Manifest invalid for schema"):
        validate_manifest_against_schema(invalid_manifest)
def test_manifest_assets_are_valid(manifest):
    assert validate_manifest_against_schema(manifest) is None
Ejemplo n.º 13
0
def cat_manifest(manifest_path: Path) -> None:
    raw_manifest = json.loads(manifest_path.read_text())
    validate_manifest_against_schema(raw_manifest)
    pretty_print_raw_manifest(raw_manifest)