def get_interface_codes(root_path: Path, contract_sources: ContractCodes) -> Dict: interface_codes: Dict = {} interfaces: Dict = {} for file_path, code in contract_sources.items(): interfaces[file_path] = {} parent_path = root_path.joinpath(file_path).parent interface_codes = extract_file_interface_imports(code) for interface_name, interface_path in interface_codes.items(): base_paths = [parent_path] if not interface_path.startswith(".") and root_path.joinpath(file_path).exists(): base_paths.append(root_path) elif interface_path.startswith("../") and len(Path(file_path).parent.parts) < Path( interface_path ).parts.count(".."): raise FileNotFoundError( f"{file_path} - Cannot perform relative import outside of base folder" ) valid_path = get_interface_file_path(base_paths, interface_path) with valid_path.open() as fh: code = fh.read() if valid_path.suffix == ".json": interfaces[file_path][interface_name] = { "type": "json", "code": json.loads(code.encode()), } else: interfaces[file_path][interface_name] = {"type": "vyper", "code": code} return interfaces
def get_interface_codes( root_path: Union[Path, None], contract_path: ContractPath, contract_sources: ContractCodes, interface_sources: Dict, ) -> Dict: interface_codes: Dict = {} interfaces: Dict = {} code = contract_sources[contract_path] interface_codes = extract_file_interface_imports(code) for interface_name, interface_path in interface_codes.items(): path = Path(contract_path).parent.joinpath(interface_path).as_posix() keys = [_standardize_path(path)] if not interface_path.startswith("."): keys.append(interface_path) key = next((i for i in keys if i in interface_sources), None) if key: interfaces[interface_name] = interface_sources[key] continue key = next((i + ".vy" for i in keys if i + ".vy" in contract_sources), None) if key: interfaces[interface_name] = { "type": "vyper", "code": contract_sources[key] } continue if root_path is None: raise FileNotFoundError( f"Cannot locate interface '{interface_path}{{.vy,.json}}'") parent_path = root_path.joinpath(contract_path).parent base_paths = [parent_path] if not interface_path.startswith("."): base_paths.append(root_path) elif interface_path.startswith("../") and len( Path(contract_path).parent.parts) < Path( interface_path).parts.count(".."): raise FileNotFoundError( f"{contract_path} - Cannot perform relative import outside of base folder" ) valid_path = get_interface_file_path(base_paths, interface_path) with valid_path.open() as fh: code = fh.read() if valid_path.suffix == ".json": interfaces[interface_name] = { "type": "json", "code": json.loads(code.encode()) } else: interfaces[interface_name] = {"type": "vyper", "code": code} return interfaces
def get_interface_codes(root_path: Path, contract_sources: ContractCodes) -> Dict: interface_codes: Dict = {} interfaces: Dict = {} for file_path, code in contract_sources.items(): interfaces[file_path] = {} parent_path = root_path.joinpath(file_path).parent interface_codes = extract_file_interface_imports(code) for interface_name, interface_path in interface_codes.items(): base_paths = [parent_path] if not interface_path.startswith(".") and root_path.joinpath(file_path).exists(): base_paths.append(root_path) elif interface_path.startswith("../") and len(Path(file_path).parent.parts) < Path( interface_path ).parts.count(".."): raise FileNotFoundError( f"{file_path} - Cannot perform relative import outside of base folder" ) valid_path = get_interface_file_path(base_paths, interface_path) with valid_path.open() as fh: code = fh.read() if valid_path.suffix == ".json": contents = json.loads(code.encode()) # EthPM Manifest (EIP-2678) if "contractTypes" in contents: if ( interface_name not in contents["contractTypes"] or "abi" not in contents["contractTypes"][interface_name] ): raise ValueError( f"Could not find interface '{interface_name}'" f" in manifest '{valid_path}'." ) interfaces[file_path][interface_name] = { "type": "json", "code": contents["contractTypes"][interface_name]["abi"], } # ABI JSON file (either `List[ABI]` or `{"abi": List[ABI]}`) elif isinstance(contents, list) or ( "abi" in contents and isinstance(contents["abi"], list) ): interfaces[file_path][interface_name] = {"type": "json", "code": contents} else: raise ValueError(f"Corrupted file: '{valid_path}'") else: interfaces[file_path][interface_name] = {"type": "vyper", "code": code} return interfaces
def get_interface_codes( root_path: Union[Path, None], contract_path: ContractPath, contract_sources: ContractCodes, interface_sources: Dict, ) -> Dict: interface_codes: Dict = {} interfaces: Dict = {} code = contract_sources[contract_path] interface_codes = extract_file_interface_imports(code) for interface_name, interface_path in interface_codes.items(): # If we know the interfaces already (e.g. EthPM Manifest file) if interface_name in interface_sources: interfaces[interface_name] = interface_sources[interface_name] continue path = Path(contract_path).parent.joinpath(interface_path).as_posix() keys = [_standardize_path(path)] if not interface_path.startswith("."): keys.append(interface_path) key = next((i for i in keys if i in interface_sources), None) if key: interfaces[interface_name] = interface_sources[key] continue key = next((i + ".vy" for i in keys if i + ".vy" in contract_sources), None) if key: interfaces[interface_name] = { "type": "vyper", "code": contract_sources[key] } continue if root_path is None: raise FileNotFoundError( f"Cannot locate interface '{interface_path}{{.vy,.json}}'") parent_path = root_path.joinpath(contract_path).parent base_paths = [parent_path] if not interface_path.startswith("."): base_paths.append(root_path) elif interface_path.startswith("../") and len( Path(contract_path).parent.parts) < Path( interface_path).parts.count(".."): raise FileNotFoundError( f"{contract_path} - Cannot perform relative import outside of base folder" ) valid_path = get_interface_file_path(base_paths, interface_path) with valid_path.open() as fh: code = fh.read() if valid_path.suffix == ".json": code_dict = json.loads(code.encode()) # EthPM Manifest v3 (EIP-2678) if "contractTypes" in code_dict: if interface_name not in code_dict["contractTypes"]: raise JSONError( f"'{interface_name}' not found in '{valid_path}'") if "abi" not in code_dict["contractTypes"][interface_name]: raise JSONError( f"Missing abi for '{interface_name}' in '{valid_path}'" ) abi = code_dict["contractTypes"][interface_name]["abi"] interfaces[interface_name] = {"type": "json", "code": abi} # ABI JSON (`{"abi": List[ABI]}`) elif "abi" in code_dict: interfaces[interface_name] = { "type": "json", "code": code_dict["abi"] } # ABI JSON (`List[ABI]`) elif isinstance(code_dict, list): interfaces[interface_name] = { "type": "json", "code": code_dict } else: raise JSONError(f"Unexpected type in file: '{valid_path}'") else: interfaces[interface_name] = {"type": "vyper", "code": code} return interfaces