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
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)
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
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)
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
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)
def validate(manifest: Manifest) -> Manifest: """ Return a validated manifest against the V2-specification schema. """ validate_manifest_against_schema(manifest) return manifest
def test_validate_manifest_invalidates(invalid_manifest): with pytest.raises(ValidationError): validate_manifest_against_schema(invalid_manifest)
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
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
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)