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 parent_path == root_path: 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 test_extract_file_interface_imports(assert_compile_failed): code = """ import a as FooBarInterface """ assert extract_file_interface_imports(code) == {'FooBarInterface': 'a'} invalid_no_alias_code = """ import a """ assert_compile_failed( lambda: extract_file_interface_imports(invalid_no_alias_code), StructureException ) invalid_interfac_already_exists_code = """ import a as A import a as A """ assert_compile_failed(lambda: extract_file_interface_imports(invalid_interfac_already_exists_code), StructureException) # noqa: E501
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(): keys = [ Path(contract_path).parent.joinpath(interface_path).as_posix(), 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 parent_path == root_path: 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": 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 test_extract_file_interface_imports_raises(code, assert_compile_failed): assert_compile_failed(lambda: extract_file_interface_imports(code), StructureException)
def test_extract_file_interface_imports(code): assert extract_file_interface_imports(code[0]) == {'Foo': code[1]}