def test_builder_with_standard_token_manifest(standard_token_package, dummy_ipfs_backend, monkeypatch): root, expected_manifest, compiler_output = standard_token_package ipfs_backend = get_ipfs_backend() monkeypatch.chdir(root) manifest = build( {}, package_name("standard-token"), manifest_version("ethpm/3"), version("1.0.0"), pin_source("StandardToken", compiler_output, ipfs_backend), pin_source("Token", compiler_output, ipfs_backend), contract_type("StandardToken", compiler_output, abi=True, devdoc=True, source_id=True), contract_type("Token", compiler_output, abi=True, devdoc=True, userdoc=True, source_id=True), validate(), ) assert manifest == expected_manifest
def test_builder_with_alias_and_select_contract_types(owned_package_devdoc): _, _, compiler_output = owned_package_devdoc manifest = build( BASE_MANIFEST, contract_type( "Owned", compiler_output, alias="OwnedAlias", abi=True, natspec=True, deployment_bytecode=True, runtime_bytecode=True, compiler=True, ), validate(), ) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"]) expected = assoc( BASE_MANIFEST, "contract_types", {"OwnedAlias": assoc(contract_type_data, "contract_type", "Owned")}, ) assert manifest == expected
def test_builder_raises_exception_if_selected_contract_type_missing_from_solc( owned_package): _, _, compiler_output = owned_package with pytest.raises(ManifestBuildingError): build( BASE_MANIFEST, contract_type("Owned", compiler_output, abi=True, natspec=True), )
def test_builder_manages_duplicate_compilers(owned_package): _, _, compiler_output = owned_package manifest = build( BASE_MANIFEST, contract_type( "Owned", compiler_output, abi=True, compiler=True, source_id=True, ), contract_type( "Owned", compiler_output, alias="OwnedAlias", abi=True, compiler=True, source_id=True, ), validate(), ) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"], "Owned.sol") compiler_data = contract_type_data.pop("compiler") contract_type_data.pop('deploymentBytecode') contract_type_data.pop('devdoc') contract_type_data.pop('userdoc') compiler_data_with_contract_types = assoc(compiler_data, 'contractTypes', ['Owned', 'OwnedAlias']) expected_with_contract_types = assoc( BASE_MANIFEST, "contractTypes", { "Owned": assoc(contract_type_data, "contractType", "Owned"), "OwnedAlias": assoc(contract_type_data, "contractType", "Owned"), }, ) expected_with_contract_types['contractTypes']['Owned'].pop("contractType") expected = assoc(expected_with_contract_types, 'compilers', [compiler_data_with_contract_types]) assert manifest == expected
def test_builder_with_default_contract_types(owned_package): _, _, compiler_output = owned_package manifest = build(BASE_MANIFEST, contract_type("Owned", compiler_output), validate()) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"]) expected = assoc(BASE_MANIFEST, "contract_types", {"Owned": contract_type_data}) assert manifest == expected
def test_builder_raises_exception_if_selected_contract_type_missing_from_solc( owned_package): _, _, compiler_output = owned_package with pytest.raises(ManifestBuildingError, match="runtimeBytecode not available"): build( BASE_MANIFEST, contract_type("Owned", compiler_output, abi=True, runtime_bytecode=True), )
def test_builder_without_alias_and_with_select_contract_types(owned_package): _, _, compiler_output = owned_package manifest = build(BASE_MANIFEST, contract_type("Owned", compiler_output, abi=True), validate()) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"]) selected_data = { k: v for k, v in contract_type_data.items() if k != "deployment_bytecode" } expected = assoc(BASE_MANIFEST, "contract_types", {"Owned": selected_data}) assert manifest == expected
def test_builder_with_default_contract_types(owned_package): _, _, compiler_output = owned_package manifest = build(BASE_MANIFEST, contract_type("Owned", compiler_output), validate()) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"], "Owned.sol") compilers_data = contract_type_data.pop('compiler') compilers_data["contractTypes"] = ["Owned"] expected_with_contract_type = assoc(BASE_MANIFEST, "contractTypes", {"Owned": contract_type_data}) expected = assoc(expected_with_contract_type, "compilers", [compilers_data]) assert manifest == expected
def test_builder_with_single_alias_kwarg(owned_package): _, _, compiler_output = owned_package manifest = build( BASE_MANIFEST, contract_type("Owned", compiler_output, alias="OwnedAlias"), validate(), ) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"]) expected = assoc( BASE_MANIFEST, "contract_types", {"OwnedAlias": assoc(contract_type_data, "contract_type", "Owned")}, ) assert manifest == expected
def test_builder_without_alias_and_with_select_contract_types(owned_package): _, _, compiler_output = owned_package manifest = build( BASE_MANIFEST, contract_type("Owned", compiler_output, abi=True, source_id=True), validate()) contract_type_data = normalize_contract_type( compiler_output["Owned.sol"]["Owned"], "Owned.sol") omitted_fields = ("deploymentBytecode", "userdoc", "devdoc", "compiler") selected_data = { k: v for k, v in contract_type_data.items() if k not in omitted_fields } expected = assoc(BASE_MANIFEST, "contractTypes", {"Owned": selected_data}) assert manifest == expected
def build_contract_types( contract_types: Iterable[str], solc_output: Dict[str, Any]) -> Iterable[Callable[..., Manifest]]: return (b.contract_type(ctype, solc_output) for ctype in contract_types)
def generate_contract_types( compiler_output: Dict[str, Any]) -> Iterable[Dict[str, Any]]: for path in compiler_output.keys(): contract_type = path.split("/")[-1].split(".")[0] yield b.contract_type(contract_type, compiler_output)
def test_builder_with_link_references(registry_package, dummy_ipfs_backend, monkeypatch): root, expected_manifest, compiler_output = registry_package monkeypatch.chdir(root) inliner = source_inliner(compiler_output) manifest = build( {}, package_name("solidity-registry"), manifest_version("2"), version("2.0.0"), inliner("Authorized"), inliner("IndexedOrderedSetLib"), inliner("PackageDB"), inliner("PackageRegistry"), inliner("PackageRegistryInterface"), inliner("ReleaseDB"), inliner("ReleaseValidator"), contract_type( "AuthorityInterface", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, ), contract_type( "Authorized", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "AuthorizedInterface", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, ), contract_type( "WhitelistAuthority", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "WhitelistAuthorityInterface", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, ), contract_type( "IndexedOrderedSetLib", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "PackageDB", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "PackageRegistry", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "PackageRegistryInterface", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, ), contract_type( "ReleaseDB", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), contract_type( "ReleaseValidator", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, natspec=True, compiler=True, ), validate(), ) assert manifest == expected_manifest
def test_builder_with_link_references(registry_package, dummy_ipfs_backend, monkeypatch): root, expected_manifest, compiler_output = registry_package ipfs_backend = get_ipfs_backend() monkeypatch.chdir(root) pinner = source_pinner(compiler_output, ipfs_backend) manifest = build( {}, package_name("registry"), manifest_version("2"), version("1.0.1"), pinner("IndexedOrderedSetLib"), pinner("PackageDB"), pinner("PackageRegistry"), pinner("PackageRegistryInterface"), pinner("ReleaseDB"), pinner("ReleaseValidator"), contract_type( "IndexedOrderedSetLib", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), contract_type( "PackageDB", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), contract_type( "PackageRegistry", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), contract_type( "PackageRegistryInterface", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), contract_type( "ReleaseDB", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), contract_type( "ReleaseValidator", compiler_output, abi=True, deployment_bytecode=True, runtime_bytecode=True, ), validate(), ) assert manifest == expected_manifest